【问题标题】:How to classify a number of rectangles of different sizes如何对多个不同大小的矩形进行分类
【发布时间】:2013-02-09 06:11:42
【问题描述】:

我有几个不同大小的矩形。现在我需要一个算法来根据大小对矩形进行分类。

关键是它不是固定大小的。例如,一个宽度为 30 高度为 20 的矩形,另一个宽度为 31 高度为 19 的矩形应该放在一个组中。但是一个宽40高30的矩形应该放在另一个组中。

并且确定组的数量和大小应该是自动完成的。你推荐我什么算法...

事实上,我想根据形状对矩形进行分组,而不是按面积或间距。

【问题讨论】:

  • 只有你知道应该使用什么规则来划分组......
  • 听起来就像你想使用矩形的面积,但实际上,只有你会知道什么是合适的算法
  • 您已经举了一个例子,但信息太少,无法确定任何算法。 为什么将矩形放置在这些组中?
  • 首先是数学和逻辑,而不是算法和 C#。您的问题非常特殊。您实际上并没有非常精确地告诉我们分组应该是什么。我可以尝试猜测您对 2 个主要变量感兴趣:宽度和高度,或者说比率和面积(我猜您不会考虑高度为 100 和宽度为 1 的高塔类似于小而坚固的 10x10框,对吗?所以有适合你的比率)。如果这是真的,那么做一个函数:Diff(r1,r2,a1,a2)=ABS(r1-r2)+ABS(a1-a2)。然后选择一个你认为是“相同”上限的阈值。
  • 哈米德,你真的不在乎形状吗?您是否认为大小为 0.1 * 1000 的矩形与大小为 10 * 10 的矩形相同?

标签: c# algorithm sorting image-processing


【解决方案1】:

我将您的问题解释为“在给定特定规则的情况下,我如何对表示矩形集的问题进行建模”。

在集合论中,您可以通过定义一个Characteristic Function 来定义一个集合,该Characteristic Function 接受一个元素并告诉您该元素是否在集合中。 该特征函数可以方便地通过 c# 中的Predicate 建模。

所以,假设你有这个 Rectangle 类:

public class Rectangle 
{
    public int height {get; private set;} 
    public int width {get; private set;}

    public Rectangle(int height, int width) 
    {
        this.height=height;
        this.width=width;
    }

    public int Area {
        get {return height*width;}
    }
}

您现在可以将您的组定义为谓词。 例如,您可以像这样定义一组小矩形:

Predicate<Rectangle> SmallRectangles = r => r.Area < 100;

或者您可以像这样定义一组又窄又高的矩形:

Predicate<Rectangle> NarrowAndTallRectangles = r => r.width/r.height > 1000;

它是这样使用的:

var test = new Rectangle(1,2);
Console.WriteLine("is it small? {0}" ,SmallRectangles(test));
Console.WriteLine("is it narrow and tall? {0}" ,NarrowAndTallRectangles(test));
    // output: 
    // is it small? True
    // is it narrow and tall? False

【讨论】:

  • 其实谓词好像是基于width + height,即。周长的一半。但我明白你的意思是解释一般情况。顺便说一句,很好的解释。
  • 谢谢,但这并没有解决我的问题。您如何看待使用均值、方差和标准差对它们进行分类。
  • 这是一个和其他任何想法一样好的(和任意的)想法。我所知道的唯一常用的矩形分类是基于边的比率。如果比率为 1,则矩形可以归类为正方形。如果其中一侧的长度为 0,则您有一个段。如果两者都是 0,那么你有一个点。如果您的矩形代表电视屏幕,那么您也有 4:3 和 16:9。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多