2011-04-22 209 views
1

我正在使用C#(VS 2008)中的GDI +进行成像应用程序工作,并且遇到了一些问题。我的画布上有一个矩形,画布上有一个随机大小的四边形。我知道矩形和四边形的4个角点。我需要计算适合我的矩形的最小四边形。新的四边形需要从画布上已有的四边形计算出来。新四边形不一定是我现有四边形的缩放版本,但输入和输出四边形的边必须平行。我上传了一张图片来描述问题。从给定的四边形中找出符合矩形的最小四边形

http://www.4shared.com/photo/dufR-UeN/SmallQuad.html

任何想法我怎么能去呢?

在此先感谢。

回答

2

好了,让ABCD是点在定义随机四边形:

  • 1是段[AB]
  • 2是段[BC]
  • 3段[CD]
  • 4是段[DA]

否w让E(左上),F(右上),G(左下),H(右下)是矩形的点。在你的形象,你必须确定:

  • 并行的由E方程1次通过(我们称之为1' )
  • 并行的由F方程2通过(我们称之为2 “)
  • 并行至3通过由G等式(让我们称之为3”)
  • H所述并行的方程(4)通过(让我们称之为4' )

然后你可以计算它们的交点,这反过来给你你需要的线。

让我们确定1'(其他类似):与1并行的所有行都具有与1相同的斜率。

s1 = (yB - yA)/(xB - xA) 

然后1' 具有像y = s1 * x + b等式:和该斜率s1由下式给出。因为我们希望这条线到达点E(xE, yE),我们有b

yE = s1 * xE + b => b = yE - s1 * xE 

,然后1' 没有公式:y = s1 * (x - xE) + yE。类似地,对于方程y = s2 * (x - xF) + yF,s2,2'具有由BC的坐标确定,对于3'和4'同样。

我们现在想的1' 和2' 的交集:这一点I具有坐标验证这两条线的方程,所以:

yI = s1 * (x - xE) + yE 
yI = s2 * (x - xF) + yF 

所以:

s1 * (xI - xE) + yE = s2 * (xI - xF) + yF 

这给你xI然后yI

xI = (s1 * xE - s2 * xF + yF - yE)/(s1 - s2) 
yI = s2 * (xI - xF) + yF 
    = (s1 * s2 * xE - s1 * s2 * xF + s1 * yF - s2 * yE)/(s1 - s2) 

您可以同样的方式确定J(2'和3'交叉点),K(3'和4'交点)和L(4'和1'交点)的坐标。你需要的四边形由这4个点组成I,J,KL

+0

这是我在一个月中见过的最令人敬畏的答案。你必须挂在http://mathoverflow.net/ +1 – 2011-04-22 12:56:50

+0

感谢您的好评,jamietre! – Emmanuel 2011-04-22 13:01:27

+0

那是超级快速的伊曼纽尔。非常感谢你的努力。但根据你的描述,我尝试了随机图纸。看看这个链接:http://www.4shared.com/photo/7b0CphrR/SmallQuad2.html 我该如何解决?再次感谢Emmanuel。 – 2011-04-22 13:25:06