当前位置:编程学习 > VB >>

发一个算法问题

如图所示,(请忽略图上的误差,默认三个多边形四边长度相等,倾角相等)

蓝色多边形和矩形是橙色多边形和矩形旋转得来,绿色多边形和矩形是橙色多边形和矩形镜面效果后得来

已知橙色多边形的各点坐标,橙色矩形的各点坐标。

现有一多边形(绿色,各点坐标已知),我如何知道绿色多边形是橙色多边形的镜面效果?

现有一多边形(蓝色,各点坐标已知),我如何知道绿色多边形是橙色多边形旋转的效果?

另外如果取橙色矩形左下角坐标为基准,如何找到蓝色矩形及绿色矩形相应点的坐标

实际应用中三套图形分别在不同的文件中,所以三套坐标之间没有联系。

谢谢


--------------------编程问答-------------------- 图看不到 --------------------编程问答-------------------- 不会,看不到图~~帮你顶顶~,呵呵 --------------------编程问答-------------------- 不如把图上传到你的CSDN相册里,这样大家看起来快些 --------------------编程问答--------------------

这样可以了么?

谢谢 --------------------编程问答-------------------- 取一个点,比如左下角那个,和剩下的点分别计算斜率或者角度,
如果是旋转,角度变化值相同,
如果是镜像,斜率相等,正负相反。。 --------------------编程问答-------------------- 镜面比较好搞   一个定右上的点做基点  一个用左上的点做基点  遍历一个图形  看看对方是否有对应的点 --------------------编程问答-------------------- 旋转地话。。笨一点就把一个图形转个360度 每转一次比较一下2图形是否相同。。。方法可以参照对比镜面的。。 --------------------编程问答-------------------- (1)找到多边形的公共点(比如重心,也许还有有中心,不过重心一定有的)
(2)以公共点为坐标原点
(3)如果是镜面,任一点的坐标应该是一个相同,一个相反,比如(x, y) <==> (x, -y)
(4)如果是旋转:非平移,非镜像状态
如有差错,请楼下补充或修改 --------------------编程问答--------------------
引用 8 楼 wozhaolala 的回复:
(1)找到多边形的公共点(比如重心,也许还有有中心,不过重心一定有的)
(2)以公共点为坐标原点
(3)如果是镜面,任一点的坐标应该是一个相同,一个相反,比如(x, y) <==> (x, -y)
(4)如果是旋转:非平移,非镜像状态
如有差错,请楼下补充或修改
(3)如果是镜面,对应点的坐标应该是一个相同,一个相反,比如(x, y) <==> (x, -y) --------------------编程问答-------------------- --------------------编程问答-------------------- 还是对称的好搞。
两个图的宽高一样。
w = 图宽, 单位像素
遍历橙色图的每一个点(x,y)   x,y 的单位像素
如果是白色 则 绿色图 的 (w -x ,y) 也是白色
如果是橙色色 则 绿色图 的 (w -x ,y)  是绿色

旋转的话,宽高不一定一致,很难搞,没有具体思路。
大概想法是 先找出4个顶点的坐标,判断旋转了多少度,
然后把橙色图也旋转同样角度,再比较,好像是比较笨的办法。
--------------------编程问答-------------------- 如果 起点坐标是(1,1) 的话 对称位置应该是 (w - x+1 ,y)  --------------------编程问答--------------------
引用 8 楼 wozhaolala 的回复:
(1)找到多边形的公共点(比如重心,也许还有有中心,不过重心一定有的)
(2)以公共点为坐标原点
(3)如果是镜面,任一点的坐标应该是一个相同,一个相反,比如(x, y) <==> (x, -y)
(4)如果是旋转:非平移,非镜像状态
如有差错,请楼下补充或修改


如果是旋转呢? --------------------编程问答--------------------
引用 13 楼 clear_zero 的回复:
如果是旋转呢?

从你的图看旋转的矩形则相邻两边
点的坐标x,y均不相等,比如相邻两
点为(x1,y1)和(x2,y2),则x1<>x2
并且y1<>y2;而镜像的相邻两点必
有一轴相等,比如相邻两点为(x1,y1)
和(x2,y2),则x1=x2或y1=y2。

如此发散一下思维,应该能得一种方法。
--------------------编程问答-------------------- --------------------编程问答-------------------- 如果确定没有其它因素影响这些几何形,那么把它们之前的位置关系分为三种情况:
1 相同,即没有旋转和镜向。
2 镜向
3.旋转

分别将每个多边形(其实就是棱形)的长短对角线与X轴正方向的角度求出来,funcA:
如果两个多边形的这2个值相等,则为情况1。
如果不为情况1,则进行如下算法 funcB:
以 funcA 中得到的两个多边形的长对角线和X轴正方向的角度为旋转角度进行旋转运算,旋转完成后,进行funcA, 如果相同,则为情况2,否则为情况3.
--------------------编程问答-------------------- 忘了问一个很重要的问题,是几维空间啊!还有,如果这个多边形的两条对角线一样长,成了正方形,这个算法就还要多出一些内容:根据实心小方块的位置才能进行判断。 --------------------编程问答--------------------
引用 16 楼 zhoujk 的回复:
如果确定没有其它因素影响这些几何形,那么把它们之前的位置关系分为三种情况:
1 相同,即没有旋转和镜向。
2 镜向
3.旋转

分别将每个多边形(其实就是棱形)的长短对角线与X轴正方向的角度求出来,funcA:
如果两个多边形的这2个值相等,则为情况1。
如果不为情况1,则进行如下算法 funcB:
以 funcA 中得到的两个多边形的长对角线和X轴正方向的角度为旋转角度进行旋转……


谢谢提点,实际应用中不是菱形,而是任意多边形
--------------------编程问答--------------------
引用 17 楼 zhoujk 的回复:
忘了问一个很重要的问题,是几维空间啊!还有,如果这个多边形的两条对角线一样长,成了正方形,这个算法就还要多出一些内容:根据实心小方块的位置才能进行判断。


二维空间,正方形不在这个之列 --------------------编程问答-------------------- 哦,清灵mm --------------------编程问答-------------------- 发一些测试数据来,我试试看。 --------------------编程问答--------------------
引用 13 楼 clear_zero 的回复:
引用 8 楼 wozhaolala 的回复:

(1)找到多边形的公共点(比如重心,也许还有有中心,不过重心一定有的)
(2)以公共点为坐标原点
(3)如果是镜面,任一点的坐标应该是一个相同,一个相反,比如(x, y) <==> (x, -y)
(4)如果是旋转:非平移,非镜像状态
如有差错,请楼下补充或修改


如果是旋转呢?
哈哈, 旋转的写错了,旋转==非镜像状态且非未旋转状态


--------------------编程问答-------------------- 非未旋转状态就是对应点都相同,就是16楼的相同
--------------------编程问答--------------------
引用 21 楼 caozhy 的回复:
发一些测试数据来,我试试看。

怎么发数据,一个AutoCAD 文件? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 18 楼 clear_zero 的回复:
实际应用中不是菱形,而是任意多边形

你在一楼说的是:
“如图所示,(请忽略图上的误差,默认三个多边形四边长度相等,倾角相等)”
这个应该是棱形了吧。
如果不是,或者是正方形,要麻烦一点,基准点可能出错。所以要重新考虑算法
--------------------编程问答-------------------- 前面已经有人说过的一个方法:
找到外部几何形体的重心。然后以此为坐标原心,得到所有点的坐标。如果多边形有轴对称现象,则可能出现混淆,这时就要使用内部的这个小几何形来进行定向。
然后用我在16楼的方法来做。还有个问题,如果是镜像的话,可能镜像的轴不一定是与X或Y平行,所以11楼的方法不一定正确。发现这种情况:所有的对应三角形全等,但是旋转到同向后不能重合,就应该可以判断是镜像了。 --------------------编程问答-------------------- 楼主,好久不见了啊! --------------------编程问答--------------------
引用 28 楼 veron_04 的回复:
楼主,好久不见了啊!


lz现在懒了 --------------------编程问答-------------------- 来看看LZ。 --------------------编程问答-------------------- 全部通过平移、旋转和镜像来做
(1)先将橙色多边形的一个顶点移动到原点,将其中一条边转到+X轴上,作为标准图形。图中所示正好。
(2)无论绿色图形还是蓝色图形:
 (a)分别将4个顶点移到原点,再分别将每个顶点上的两条边转到+X轴上,一共8个图形,只要这8个图形之一与(1)中的标准图形相等,那么该种颜色的原始图形是通过橙色图形旋转得到的。
 (b)将(a)中的8个图形按X轴镜像,得到新的8个图形,只要这8个图形之一与(1)中的标准图形相等,那么该种颜色的原始图形是通过橙色图形镜像得到的。

任意多边形以此类推。 --------------------编程问答--------------------
引用 27 楼 zhoujk 的回复:
前面已经有人说过的一个方法:
找到外部几何形体的重心。然后以此为坐标原心,得到所有点的坐标。如果多边形有轴对称现象,则可能出现混淆,这时就要使用内部的这个小几何形来进行定向。
然后用我在16楼的方法来做。还有个问题,如果是镜像的话,可能镜像的轴不一定是与X或Y平行,所以11楼的方法不一定正确。发现这种情况:所有的对应三角形全等,但是旋转到同向后不能重合,就应该可以判断是镜像了。
是啊,镜像轴是任意线怎么办,这个到没想到 --------------------编程问答-------------------- 我没回答,因为老虎会回答的。 --------------------编程问答-------------------- 算法问题应该给300分的,这个比程序问题费脑子。 --------------------编程问答-------------------- 1 镜像. 
  单纯只有四边形的时候,是镜像的时候,应该是数学中的映射问题.橙色左下边斜率与绿色右下边斜率相同,橙色右下边斜率与绿色左下边斜率相同.两个4边形的四条边比例"对应"相同.且橙色右夹角与绿色左夹角相同,橙色左夹角与绿色右夹角相同.
2 旋转
  旋转也是映射,单纯的只有四边形的时候,那么四条边必须都相同,且长度相同两边的夹角相同就可以了吧.
3 根据已经知道的矩形上面的点,分别想四边型2个"对角"顶点连线.得到2条线,还能获得这两条线与四边形的四条边的分别夹角.然后对应画到绿色四边形中,获取交点.交点就是所得的点.
  如果是兰色的,那么就算出旋转的角度,然后很容易得到对应的点. --------------------编程问答-------------------- 希望高手回答 --------------------编程问答-------------------- 镜像如果是水平或者垂直还好,旋转我想不到好的办法 --------------------编程问答-------------------- 你又不需要求镜像的对称轴,只是判断而已。
我31楼不是描述了,先平移旋转,就全部都变成 X轴的镜像了。 --------------------编程问答-------------------- OpenCV
再不行恐怕要动用人件了。 --------------------编程问答-------------------- ........... --------------------编程问答-------------------- 请楼主告诉我,我说的旋转有什么问题???两个多边型全等就肯定是旋转了,还有什么复杂的? --------------------编程问答-------------------- 好难啊 --------------------编程问答-------------------- 哦,楼主说的 平面几何元素图 是不规则的多边形,内部加一个矩形。不妨先将内部的矩形 先看成缩小成其几何中心,即一个点。既然都是对称或者旋转,那么必定产生的象和原象都能重合即全等,那么问题就转化为:

如何判断在同一平面中,两个全等的多边形元素构成的象,是关于某直线轴对称,还是关于某点中心对称?即判断由两个相同的平面元素,所构成的图形,是轴对称图形,还是中心对称图形。

由于这两个元素全等,并且都是多边形,那么由它们所构成的平面图像,是不需要通过比较点,来获得是轴对称图形,还是中心对称。只需要按顺时针或者逆时针的顺序,依次取得其中一个多边形的各个内角的角度,并按顺序依次保存下来,再和另一个多边形的各角按顺序依次比较,即可求解。

具体做法:
某多边形A1-A2-A3-...-An的各个顶点所对应的角为,角A1,A2,A3,...,角An。
另一个多边形B1-B2-B3-...-Bn的各个顶点所对应的角为,角B1,B2,B3,...,角Bn。

中心对称:
由于两多边形的顶角都为n个,因此按顺时针的顺序依次标记其中一多边形各角,会获得n种结果,另同。
因此当两图形比对时,最多需要比较n^2次,这里只要按顺序匹对,并依次比对角度时,一次中两图形的角度全部吻合,即两多边形是关于中心对称。
轴对称:
就需要将两个多边形顺时针顺序分别标记顶点,然后把标记的顶点按顺序匹对,并依次连接成线段,取每条线段的中点,得到n各点,只需判断这n各点共线,那么就是轴对称。

那么就可以开始比较两图形内部的矩形。首先需要将两多边形重合起来,是轴对称的先再次翻转一次,否则即可按上面的结果,把两多边形的各个相应的顶点平移至同一坐标点。此时外部的两多边形已经重合在一起。
这里首先判断内部的矩形的中心点是否能够重合,能,则进行下一步。直接判断两个位于多边形内部的矩形,在经过上述的平移后,是否能够重合在一起,方法略。
由此之下,只要内部的两矩形在外部的多边形重合在一起时,两矩形也重合。就可以得到上述的两个象构成的图形,是轴对称图形,还是中心对称图形。


附:要通过点对点进行比对也可以,但是关键是使用【上下文识别坐标系】,基本如下图所示:

--------------------编程问答-------------------- 晕数学,晕算法。 --------------------编程问答-------------------- 学习学习 精神支持 --------------------编程问答-------------------- 本来都打了不少字了,后来觉得也不是很好,帮顶了 --------------------编程问答-------------------- 关注,顶上去 --------------------编程问答--------------------
先拣容易的说说。

镜像检验应该比较简单:

将要比较的两个多边形中的一个,先作镜像反转。用反转后的与另一个比较。
比较前,将两个样本图形归一化平移。例如所有的点都减去左下角坐标。

如果逐点比较相同,则原图形是互为镜像的。
--------------------编程问答--------------------
旋转的情况比较困难。你不可能让图形穷举所有的角度进行旋转,再来比对。

对于两个图形,首先要找到对应边。

不知楼主的矩形是否确定存在。如果是利用两个矩形的边的夹角,可以找出可能的旋转角度。实际上,只能有两个可能的角度。按这些角度旋转其中一个,然后如上逐点比较。
--------------------编程问答-------------------- 昏昏...计算机高手来吧 --------------------编程问答-------------------- 图像学 AI --------------------编程问答--------------------
进一步展开一下利用矩形解决旋转的问题。

1 找到矩形。实际上这一步包含很多算法。

2 判断矩形的一边与 Y 轴的夹角。

3 如果是 0 或 90 度,有 4 种可能:全图旋转了 0 度,90 度,180 度或 270 度。
  按四种情况,逐一进行回转、归一平移、逐点比较。

4 如果是其他角度,首先旋转此夹角(锐角),使其成为上例情况。后同。

计算处理与人工智能最大的不同在于,计算处理常常是利用计算机的速度进行遍历或穷举。

--------------------编程问答--------------------
找到同一图形的镜像或旋转,点对应的问题就迎刃而解。

将比对相同的图形,各点进行比对前的逆处理(平移、旋转或翻转),逆处理前后各点的坐标,就是对应点。 --------------------编程问答-------------------- of123 说了那么多,与我 31楼的方法有什么不同?
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,