当前位置: 代码迷 >> VFP >> 这样的任务能够通过简单的方法实现吗?该怎么解决
  详细解决方案

这样的任务能够通过简单的方法实现吗?该怎么解决

热度:5827   发布时间:2013-02-26 00:00:00.0
这样的任务能够通过简单的方法实现吗?
如何快捷的要确定一个点的坐标是否在某个图形内,图形是有矩形和三角形组成的(如图)。
我现在的做法是将图形分成矩形和三角形一个一个的比较,矩形好比较,三角形比较麻烦。

图形大小,形状有时会变化,但最复杂的也就是这个了。
大家看看有没有简单的算法

------解决方案--------------------------------------------------------
Dimension LineArr(8,4)
LineArr(1,1)=0
LineArr(1,2)=0
LineArr(1,3)=6
LineArr(1,4)=0

LineArr(2,1)=6
LineArr(2,2)=0
LineArr(2,3)=6
LineArr(2,4)=8

LineArr(3,1)=6
LineArr(3,2)=8
LineArr(3,3)=0
LineArr(3,4)=10

LineArr(4,1)=0
LineArr(4,2)=10
LineArr(4,3)=0
LineArr(4,4)=6

LineArr(5,1)=0
LineArr(5,2)=6
LineArr(5,3)=4
LineArr(5,4)=6

LineArr(6,1)=4
LineArr(6,2)=6
LineArr(6,3)=4
LineArr(6,4)=2

LineArr(7,1)=4
LineArr(7,2)=2
LineArr(7,3)=0
LineArr(7,4)=2

LineArr(8,1)=0
LineArr(8,2)=2
LineArr(8,3)=0
LineArr(8,4)=0
If ISINNER(5,7,99999,99999,@LineArr)
=Messagebox('点在多边体内',64,'Message')
Else
=Messagebox('点在多边体外',64,'Message')
ENDIF

Function ISINNER()
Parameters X1,Y1,X2,Y2,LineArr
*********************X1,Y1为要判断的点,X2,Y2为多边体外参考点********************
Local nInterNum,nLineNum
nLineNum = Alen(LineArr) / 4
nInterNum = 0
For i =1 To nLineNum
If ISINSACTION(X1,Y1,X2,Y2,Linearr(i,1),Linearr(i,2),Linearr(i,3),Linearr(i,4))
nInterNum=nInterNum+1
Endif
Endfor
If nInterNum % 2 = 1
Return .T.
Else
Return .F.
Endif
Endfunc

Function ISINSACTION()
Lparameters X1,Y1,X2,Y2,X3,Y3,X4,Y4
Local V1,V2,V3,V4
V1=(X2-X1)*(Y4-Y1)-(Y2-Y1)*(X4-X1)
V2=(X2-X1)*(Y3-Y1)-(Y2-Y1)*(X3-X1)
If V1*V2>0
Return .F.
Endif
V3=(X4-X3)*(Y2-Y3)-(Y4-Y3)*(X2-X3)
V4=(X4-X3)*(Y1-Y3)-(Y4-Y3)*(X1-X3)
If V3*V4>=0
Return .F.
Endif
Return .T.
Endfunc



  相关解决方案