- UID
- 60560
- 积分
- 230
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-6-23
- 最后登录
- 1970-1-1
|
发表于 2005-10-25 14:59:46
|
显示全部楼层
我写的 没时间再折腾了,你看看有用吗
int offset(int &x1,int &y1,int &x2,int &y2,int delta)
{
Cx Line1;
Line1.Add(Cd(x1,y1));
Line1.Add(Cd(x2,y2));
Cx Line2;
int res=offset(Line1,delta,Line2);
if(res)
{
x1=(int)Line2[0].x;
y1=(int)Line2[0].y;
x2=(int)Line2[1].x;
y2=(int)Line2[1].y;
}
return res;
}
int offset(Cx Line1 ,double delta,Cx &Line2)
//offset
//0 无效
//1 有效
//delta >0 右移 delta <0 左移
//x1 ==>> x2
{
int Upper=Line1.GetUpperBound();
if(Upper <1) return 0;//无效
for(int i=0;i<Upper;i++)
{
if(fabs(Line1.x-Line1[i+1].x) < 0.001 && fabs(Line1.y-Line1[i+1].y) < 0.001)
{
Line1.RemoveAt(i+1);//滤掉直线段长度为0的点,否则图不对
Upper--;
}
}
if(Upper < 1 )
return 0;
Cfx fx,ffx;//方向,反方向
if(delta < 0)
{
fx=Left;
ffx = Right;
}
else
{
ffx=Left;
fx = Right;
}
double x1,y1,x2,y2,x3,y3,x4,y4;
qxzjzb(Line1[1].x,Line1[1].y,Line1[0].x,Line1[0].y,fabs(delta),ffx,x1,y1);
qxzjzb(Line1[0].x,Line1[0].y,Line1[1].x,Line1[1].y,fabs(delta), fx,x2,y2);
Line2.Add(Cd(x1,y1));
if(Upper < 2)
Line2.Add(Cd(x2,y2));
for(i=1;i<Upper;i++)
{
qxzjzb(Line1.x,Line1.y,Line1[i+1].x,Line1[i+1].y,fabs(delta), fx,x4,y4);
qxzjzb(Line1[i+1].x,Line1[i+1].y,Line1.x,Line1.y,fabs(delta),ffx,x3,y3);
Cd d;
if(Intersect(Cd(x1,y1),Cd(x2,y2),Cd(x4,y4),Cd(x3,y3),d)==0)
int temp=0;
Line2.Add(d);
x1=x3,x2=x4,y1=y3,y2=y4;
}
qxzjzb(Line1[Upper-1].x,Line1[Upper-1].y,Line1[Upper].x,Line1[Upper].y,fabs(delta), fx,x4,y4);
Line2.Add(Cd(x4,y4));
return Upper+1;
} |
|