图形学的高手请进

jianan_wei 2001-06-18 11:28:00
加精
图形学的高手们:给你们出一道题目:
怎样offset 一条bezier 曲线。就像autocad中的一样。
...全文
182 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2001-06-20
  • 打赏
  • 举报
回复
下面这个是bezier曲线放样的代码,里面用到了平行曲线,你参考一下。

struct f_point{
float x,y;
};
struct shape{
int nPoints;
f_point* pPoint;
};

int BezierLoft( f_point* ctrlPoint,shape &LoftShape,D_Link& dl,int step,float tu,float tv)
{
static float a0,a1,a2,a3,b0,b1,b2,b3,dx,dy,dx2y2,sina,cosa;
static float x0[20],y0[20],z0[20],x1,y1;
D3DVERTEX* pvex[20];
float f_step;

dl.D_DELETEALL();

a0= ctrlPoint[0].x;
a1= -3* ctrlPoint[0].x + 3*ctrlPoint[1].x ;
a2= 3* ctrlPoint[0].x - 6*ctrlPoint[1].x + 3*ctrlPoint[2].x;
a3= - ctrlPoint[0].x + 3*ctrlPoint[1].x - 3*ctrlPoint[2].x + ctrlPoint[3].x;

b0= ctrlPoint[0].y;
b1= -3*ctrlPoint[0].y + 3*ctrlPoint[1].y ;
b2= 3*ctrlPoint[0].y - 6*ctrlPoint[1].y + 3*ctrlPoint[2].y;
b3= - ctrlPoint[0].y + 3*ctrlPoint[1].y - 3*ctrlPoint[2].y + ctrlPoint[3].y;



for(int np=0;np<LoftShape.nPoints-1;np++)
pvex[np]=new D3DVERTEX[step<<1];

step--;
f_step=1.0f/step;

float t1,t2,t3;
t1=0;
int n_face;
static float tu1=0,tv1=0;
tv1=0;
for(int i=0;;i++,t1+=f_step)
{
if(t1>1.0f)
t1=1.0f;
t2=t1*t1;
t3=t1*t2;
if(i<step)
{
x1=a0+a1*t1+a2*t2+a3*t3;
y1=b0+b1*t1+b2*t2+b3*t3;

dx=3*a3*t2 + 2*a2*t1 + a1;
dy=3*b3*t2 + 2*b2*t1 + b1;

dx2y2=(float)sqrt(dx*dx+dy*dy);
cosa=dy/dx2y2;
sina=dx/dx2y2;
tu1=0;
for(np=0;np<LoftShape.nPoints;np++)
{
x0[np]=x1-LoftShape.pPoint[np].x*cosa;
y0[np]=LoftShape.pPoint[np].y;
z0[np]=y1+LoftShape.pPoint[np].x*sina;
if(np!=0)
{
n_face=np-1;
pvex[n_face][i<<1].x=x0[n_face];
pvex[n_face][i<<1].y=y0[n_face];
pvex[n_face][i<<1].z=z0[n_face];

pvex[n_face][i<<1].tu=tu1;
pvex[n_face][i<<1].tv=tv1;

tu1-=tu;

pvex[n_face][(i<<1)+1].x=x0[np];
pvex[n_face][(i<<1)+1].y=y0[np];
pvex[n_face][(i<<1)+1].z=z0[np];
pvex[n_face][(i<<1)+1].tu=tu1;
pvex[n_face][(i<<1)+1].tv=tv1;
}
}
}
else
{
dx=3*a3 + 2*a2 + a1;
dy=3*b3 + 2*b2 + b1;

dx2y2=(float)sqrt(dx*dx+dy*dy);
cosa=dy/dx2y2;
sina=dx/dx2y2;

x1=ctrlPoint[3].x;
y1=ctrlPoint[3].y;

tu1=0;

for(np=0;np<LoftShape.nPoints;np++)
{
x0[np]=x1-LoftShape.pPoint[np].x*cosa;
y0[np]=LoftShape.pPoint[np].y;
z0[np]=y1+LoftShape.pPoint[np].x*sina;
if(np!=0)
{
n_face=np-1;
pvex[n_face][i<<1].x=x0[n_face];
pvex[n_face][i<<1].y=y0[n_face];
pvex[n_face][i<<1].z=z0[n_face];

pvex[n_face][i<<1].tu=tu1;
pvex[n_face][i<<1].tv=tv1;

tu1-=tu;

pvex[n_face][(i<<1)+1].x=x0[np];
pvex[n_face][(i<<1)+1].y=y0[np];
pvex[n_face][(i<<1)+1].z=z0[np];
pvex[n_face][(i<<1)+1].tu=tu1;
pvex[n_face][(i<<1)+1].tv=tv1;
dl.D_ADDTAIL(pvex[np-1]);
}
}
return 1;
}
tv1+=tv;
}
}
Kevin_qing 2001-06-20
  • 打赏
  • 举报
回复
驻点、拐点是什么东西?
青润 2001-06-19
  • 打赏
  • 举报
回复
是求曲线的平行线。
onjun 2001-06-19
  • 打赏
  • 举报
回复
我想求解bezier曲线的驻点、拐点等,有没有办法?

拜托!
Kevin_qing 2001-06-19
  • 打赏
  • 举报
回复
可以保证在f'(x)->0和无穷大这两种情况下都能够做到连续。
Kevin_qing 2001-06-19
  • 打赏
  • 举报
回复
bezier的平行公式是可以求出,这个函数我已经写好了,等几天给你看看。


jianan_wei 2001-06-19
  • 打赏
  • 举报
回复
thanks a lot.看来要用微分的观念了。但是,这样就不能使用windows的polyBezierTo()等函数了!我不知道WINDOWS 使用的Bezier 曲线的函数是什么?
Kevin_qing 2001-06-19
  • 打赏
  • 举报
回复
补充一下:
对两条平行直线来说,一条直线上面的所有点到另一条直线的距离是相等的。

由微分的观点,曲线可以看作是很多细小的连在一起的直线,所以可以派生出曲线的平行线定义。
一条曲线上面的所有点到另一条曲线的距离是相等的(这里的距离不是指最近距离,而是能够与两条曲线都垂直的直线段的长度,这样的直线段应该有无数条)。

举例说,两个同心圆就是平行的曲线。
距离为r2-r1或者r2+r1(为什么有两个距离,自己画画图就知道了)。










Kevin_qing 2001-06-19
  • 打赏
  • 举报
回复
就是求曲线的平行线吗?
青润 2001-06-18
  • 打赏
  • 举报
回复
我觉得这要看你打算如何实现了,实际上offset操作的实现并不麻烦。
与你相关的环境有很大关系,比如你的曲线是矢量图还是普通点阵,他们的实现是不同的。
jianan_wei 2001-06-18
  • 打赏
  • 举报
回复
没有人来看看吗?分也给不出去了
青润 2001-06-18
  • 打赏
  • 举报
回复
如果是要求特殊效果的话,平移后需要作其他的算法处理。
我知道autocad的offset,你说的是要多个平移结果吧?做一个循环按照某一个距离进行多次平移和曲线绘制就可以了。
我想你要的不应该是简单的首尾相连后的封闭图形。
jianan_wei 2001-06-18
  • 打赏
  • 举报
回复
我知道平移的算法。但是平移后的结果仅仅是原来的曲线的一个copy
不能达到看起来像是一堵有厚度的曲线墙的目的。
比如说,我的曲线是首尾相连的,也就是一个闭合的环,那平移以后就不能成为两个相套的环。
我的要求有一些象autocad的对曲线的offset。不知道你有没有看过?
说得有些不清楚。希望你能看懂,并帮助我解决这个问题。
青润 2001-06-18
  • 打赏
  • 举报
回复
图形变换中有一个平移算法,你可以将这4个点进行平移,然后再基于这四个点和相关的条件重新绘制出曲线就可以了。
是否可以看明白?
jianan_wei 2001-06-18
  • 打赏
  • 举报
回复
终于有人回复了!
我的曲线的实现使用的是windows 的polyBezier函数。每一条bezier 曲线由4个点来控制
POINT pt[4];和标准的一样。头一个和最后一个为曲线的端点。中间两个是曲线的控制点。
我的目的是:offset 该曲线并进行变换。最后两条曲线要看起来像是一堵有厚度的曲线墙。
不知道qingrun(青润)有什么办法?

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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