有没有人会翻译这个,请帮忙翻译成C语言

abba111 2005-06-01 03:06:56
判断点px是否在多边形内
'判断点px是否在多边形内;
'即可适用于凹多边形的判断,也适用于凸多边形的判断
'所选射线px(x0 y0)--pxy(x0+2*max|x0-xi| y0+min|y0-yi|) [i=1,2 3,.......,n]不与多边形任何一点相交
'入口参数多边形:(n, ptx(), pty(), px , py)
'返回值False (在多边形外)、True(在多边形上及在多边形内)

Public Function dzdbxn(n As Long, ptx() As Double, pty() As Double, px As Double, py As Double) As Boolean
Dim j As Long
Dim d1 As Double
Dim d2 As Double
Dim d3 As Double

dzdbxn = False

For i = 1 To n
j = i + 1: If i = n Then j = 1
d1 = Abs(ptx(i) * pty(j) + ptx(j) * py + px * pty(i) - ptx(i) * py - ptx(j) * pty(i) - px * pty(j))
d2 = Pold(ptx(i), pty(i), ptx(j), pty(j))
d3 = Abs(d2 - Pold(ptx(i), pty(i), px, py) - Pold(ptx(j), pty(j), px, py))
d1 = d1 / d2
Print "i=" + Str(i) + " j=" + Str(j) + " d1=" + Str(d1) + " d3=" + Str(d3)
'注意:d1 d3判断值1前的0个数=多边形区域坐标值中小数位数-1
If d1 < 0.0001 And d3 < 0.0001 Then dzdbxn = True: Exit Function
Next i

If dzdbxn = False Then
Dim dx As Double
Dim xmax As Double
Dim dy As Double
Dim ymin As Double

For i = 1 To n
dx = Abs(ptx(i) - px): dy = Abs(pty(i) - py)
If i = 1 Then
xmax = dx: ymin = dy
Else
If dx > xmax Then xmax = dx
If dy < ymin Then ymin = dy
End If
Next i

Dim sum As Long

sum = 0: xmax = 2# * xmax
For i = 1 To n
j = i + 1: If i = n Then j = 1
d1 = ymin * (ptx(j) - ptx(i)) - xmax * (pty(j) - pty(i))
d2 = xmax * (pty(i) - py) - ymin * (ptx(i) - px)
d3 = (ptx(j) - ptx(i)) * (pty(i) - py) - (pty(j) - pty(i)) * (ptx(i) - px)
If (d2 * (d1 - d2)) >= 0# And d3 * d1 >= 0# Then sum = sum + 1
Next i
Print "sum=" + Str(sum) + " px=" + Str(px) + " py=" + Str(py)
If sum > 0 And sum <> 2 * Int(sum / 2) Then
dzdbxn = True
Else
dzdbxn = False
End If
End If
End Function
Function Pold(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double
'两点间距离计算
Pold = Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
End Function
...全文
60 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
supergreenbean 2005-06-01
  • 打赏
  • 举报
回复
瞎写了一下

#include <math.h>

double Pold(double x1,double y1,double x2,double y2){
//两点间距离计算
return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

bool dzdbxn(int n,double ptx[],double pty[],double px,double py){
int i,j;
double d1,d2,d3;

for(i=1;i<=n;i++){
j=i+1;
if(i==n)j=1;
d1=fabs(ptx[i] * pty[j] + ptx[j] * py + px * pty[i] - ptx[i] * py - ptx[j] * pty[i] - px * pty[j]);
d2 = Pold(ptx[i], pty[i], ptx[j], pty[j]);
d3 = fabs(d2 - Pold(ptx[i], pty[i], px, py) - Pold(ptx[j], pty[j], px, py));
d1 = d1 / d2;
printf("i=%d j=%d d1=%d d3=%d",i,j,d1,d3);
//注意:d1 d3判断值1前的0个数=多边形区域坐标值中小数位数-1
if(d1<0.0001&&d3<0.0001){
return true;
}
}

double dx,xmax,dy,ymin;

for(i=1;i<=n;i++){
dx = fabs(ptx[i] - px);
dy = fabs(pty[i] - py);
if(i==1){
xmax = dx;
ymin = dy;
}else{
if(dx > xmax)xmax = dx;
if(dy < ymin)ymin = dy;
}
}

int sum=0;
xmax = 2 * xmax;
for(i=1;i<=n;i++){
j=i+1;
if(i==n)j=1;
d1 = ymin * (ptx[j] - ptx[i]) - xmax * (pty[j] - pty[i]);
d2 = xmax * (pty[i] - py) - ymin * (ptx[i] - px);
d3 = (ptx[j] - ptx[i]) * (pty[i] - py) - (pty[j] - pty[i]) * (ptx[i] - px);
if((d2 * (d1 - d2)) >= 0 && d3 * d1 >= 0)sum++;
}

printf("sum=%d px=%d py=%d",sum,px,py);
return (sum>0 && sum!=2*(int)(sum/2));
}

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧