特别搞脑筋问题,200分请教高手。(100分)

  • 主题发起人 主题发起人 fuguobin
  • 开始时间 开始时间
F

fuguobin

Unregistered / Unconfirmed
GUEST, unregistred user!
问题一:已知一任意多边形的各点坐标分别为(X1,Y1)(X2,Y2)(X3,Y3)。。。(Xn,Yn),现要画一多边形要与原多边形形状一样并且所画多边形每条边与原多边形相应边平行且大出 M 距离(即把原多边形扩大M)。问所画多边形各点坐标怎么确定?望高手指点思路若有等式关系最好。
问题二一:已知一任意多边形的各点坐标分别为(X1,Y1)(X2,Y2)(X3,Y3)。。。(Xn,Yn),现一点M坐标为(a,b),请问如何确定此点是在多边形之内还是在多边形之外?望高手指点思路若有等式关系最好。
 
第一题有问题吧?比如一直角三角形,边长为3,4,5,现在将第边加上M,除非这个M满足一定条件,否则无法达到要求。
 
设新的坐标点为: (A1,B1)(A2,B2)(A3,B3)。。。(An,Bn)
问题一: 只要保证新坐标的两点的斜率相同即可保证与原来的多边形平行,即:
(B2-B1)/(A2-A1)=(Y2-Y1)/(X2-X1) 。。。。
这里你说的“大出 M 距离”只能是对其中一条边来说可以,其他的则按比例来定了不一定是M距离了,可以说是距离的alphi=(X+M)/X倍, 这里X是你一开确定的那条边。
所以呢 首先要人为确定一点和原图中的一点对应,比如(A1,B1)对应(X1,Y1)然后根据上面说的斜率来依次算出其他坐标。这里需要点几何知识很简单的自己搞定了。^-^

第二个问题麻烦一点,想一下再说了
 
第一个我觉得是先要求出多边形的重心来,然后连接重心与多边形的各个顶点,每一条射线应该通过新的多边形的定点,根据比例算出坐标来.
不一定对,个人感觉,未经证实,呵呵
第二个问题,有个可以偷懒的办法,你先给多边形上色,然后判断你M点的颜色是否为多变形的颜色(我们有个项目就是这么做的),那样就能判断是否在内外了.不过正统的办法还是用相交矩形判断吧,网上有算法

我说的情况都是针对凸多边形的,仅供参考.
 
第一个问题。纯数学问题,
其实就是两个相似三角形的比较。
若干原某点坐标为(x1,y1), 这个是已知的, 那么,扩大后, 该点的坐标假设为(x2,y2)。
那么: x1/x2=y1/y2 然后, 有 sqr(x1-x2) + sqr(y1+y2)=sqr(m)
消掉x2, 求出y2, 然后求得x2。 比较麻烦点, 然后, 每次用该公式求每个点扩大后对应点的坐标就可以了。。。。
不知道说明白没有。。。。

第二个, 好像主要得考虑凸凹的问题。 暂时没想法。
 
确实伤脑筋
 
对于第一个问题,象“8”一样形状的多边形算不算多边形,如果算,增加M后形状就无法保持原样了,如果不算,这个问题很好解决,这个问题的解决要依赖第二个问题。

第二个问题可以说不算问题,直接使用WINDOWS API创建一个多边形区域
HRGN CreatePolygonRgn(

CONST POINT *lppt, // pointer to array of points
int cPoints, // number of points in array
int fnPolyFillMode // polygon-filling mode
);
然后使用
BOOL PtInRegion(

HRGN hrgn, // handle of region
int X, // x-coordinate of point
int Y // y-coordinate of point
);
就可以了。

下面说第一个问题,从任一顶点A开始往前走,朝向相邻的下一个点B,面对的方向为正方向,把这个方向的右手边定义为右方向,左手边定义为左方向,由此AB的斜率+90度为右方向,减90度为左方向,由此可以得出过A点的左右方向两个距离为M的点,判断这两个点那一个在多边形内部,则丢弃相应的方向,这里假设右方向的点在多边形外,也就是我们需要的点,然后依次计算每个点按正方向向前前进,距离右方向M的点,走完一圈后得到了相对各条边的各个距离为M的平行线,计算这些相邻的平行线的交点,就得到新的多边形。
 
to hityou,

>>第二个问题,有个可以偷懒的办法,你先给多边形上色,然后判断你M点的颜色是否为多变形>>的颜色(我们有个项目就是这么做的),那样就能判断是否在内外了

关于这个,本人比较晕,既然你都能给多边形上色,你肯定知道那些点在多边形内才能上色,要不你如何知道你上色的点不在多边形外?如果你已经能正确上色,还要再多判断一次
不是多费一道手续么?不知道你们项目的质量是如何保证的!
 
关于第二个问题已经有了明确的实现方法以及代码:
参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1277180
最好要学会搜索以前的帖子。 [:)]
 
牛人出现了。 呵呵:0 听课。
 
to wk_knife
呵呵,我们的那个项目本身就需要上色.你用的那个api函数比较好,当时没有想到.我们当时的情况是要给地图上色的,用的GetPixel取得每个点RGB颜色,因为要跟高度挂钩,对应不同的rgb的.而且给多边形上色,我只需要设置刷子的颜色就.然后在调用polygon就可以了.因该没什么问题吧!
 
to wk_knife
看了你以前的帖子,在图形处理方面很有研究,对于生成tin网格可由可曾涉及过,我以前提问过,没人给我解答啊.还有这个帖子也帮我看看吧.谢谢了[:D]
 
to hao1701:
每边相距M这个条件没错,是你理解错了。
to duhao_lee:
按你的思路算出的X和Y都有正负两种可能,排列组合则有四种可能,取谁?
to wk_knife:
你一看就这是两个相关联的问题,佩服!不过第二个问题我要的坐标为浮点数,你的方法不行。
to winsong:
谢谢你的提醒,现在看了以前的贴子,是不是只有跳栏算法适用所有情况?
 
当然是取正数了.
 
多人接受答案了。
 
后退
顶部