“我想考研...”续帖发分,(另:卷兄,有问题要请教你....)(300分)

还是浙工大比较舒服!
 
<<gzfrank, 时间:2002-2-7 9:16:00, ID:912521
<<卷姐回家享受去了呀。
是吗,那我惨了,这个问题我看今年是解决不了了,哪位知道答案啊,我可是高分悬赏啊
to cfx: cfx,你好,前面那个帖的分已经分下去了,浙工大当然好,不过我没信心

 
过年好!!
 
恭喜发财
 
多谢了!!!
 
考不考,我好没决定[:(]
 
杭州 :
浙大
浙工大
浙江工程学院

>1
这要看你怎么构建区域了,总之就是利用PtInRegion

>2
给你3次BEZIER曲线的参数方程,自己研究哦。

C(t)=(1-t)⒊P0+3t(1-t)⒉P1+3t⒉(1-t)P2+t⒊P3
这里:P0---P3为三次BEZIER曲线的四个控制点,t为参数,c(t)即是BEZIER曲线表达式
至于如何判断是否在BEZIER曲线上,自己定义一个大概的范围就是了。

 
1.可以用CombineRgn来排除矩形区域包含在折线内部区域这种情况,再用RectInRegion
来判断折线是否与矩形区域相交
 
哪里有软件工程硕士专业?
 
曲线救国啊!
 
高手终于出场了!!!
TO:卷起千堆雪tyn
谢谢!第一个问题已经解决了用的是RectInRegion,(本来不想用的方法)
第二个问题,真是不好意思,那个方程我真的看不懂(P0-P3是点坐标,可在这里是什么………
……能不能给一点代码或者例子,如何判断一个点在bezier曲线上,我现在是用曲线的四个
控制点画一条折线,对折线进行判断,可是这种效果不太真实,帮帮我吧!

TO shaofun:谢谢你,我想你的方法应该可行,可是有一种情况:就是矩形不在折线内部而是
一部分在折线内部,并且经过折线的首点和末点之间而不与折线相交,这种情况就不好判断
我现在用的方法是将折线拆成很多线段,在循环中判断,用线段的两顶点左右偏移作成一个矩形
再和要判断的矩形通过RectInRegion判断是否相交,这种方法其实效果不错,
有没有bezier曲线的解决方法?
 
给你答案!

procedure TForm1.Button1Click(Sender: TObject);
var
PolyPoint :array [0..3] of TPoint;
Number :integer;
PPts :pPoint;
PTypes :pByteArray;
pathpoints :array [0..1000] of TPoint;
PathTypes :array [0..1000] of byte;
begin
PolyPoint[0] :=Point(30,30);
PolyPoint[1] :=Point(80,80);
PolyPoint[2] :=Point(150,15);
PolyPoint[3] :=Point(220,100);
Canvas.PolyBezier(PolyPoint);
BeginPath(Canvas.Handle);
Canvas.PolyBezier(PolyPoint);
EndPath(Canvas.Handle);
if FlattenPath(Canvas.Handle)then
begin
PPts := nil;
PTypes := nil;
Number := GetPath(Canvas.Handle,PPts,PTypes,0);
Number := GetPath(Canvas.Handle,PathPoints,PathTypes,Number);
end;
ShowMessage(IntToStr(Number));
end;

这里的PathPoints为Bezier曲线上的点,你比较点击的点与这些点的距离,
就可以大致判断是否点选了该Bezier曲线!
 
试了好一会儿,终于看懂了:你是通过FlattenPath将曲线转换成类似的折线,然后
用GETPATH获得曲线上的点,返回值是点的个数,但是如果点的个数超过数组的上限呢?
好了,我去改成C++ BUILDER的函数,再合并到程序里面去,写好了就来结束问题
 
我也来考了
 
同志,我也考研
 
卷兄,用你的例子改写成的C++ Builder函数,帖出来希望对有些朋友有用
TPoint* GetPathPoints(TCanvas* DC,TPoint PolyPionts[3],int &amp;Count)
{
int i,Number;
TPoint *PPts;
char *PTypes;
char PathTypes[1000];
TPoint PathPoints[1000];
TPoint* Result_Points;

BeginPath(DC->Handle);
DC->PolyBezier(PolyPionts,3);
EndPath(DC->Handle);
if(FlattenPath(DC->Handle))
{
Number=GetPath(DC->Handle,PPts,PTypes,0);
Number=GetPath(DC->Handle,PathPoints,PathTypes,Number);
}
Count=Number;
Result_Points=new TPoint[Number];
for(i=0;i<=Number-1;i++)
{
Result_Points.x=PathPoints.x;
Result_Points.y=PathPoints.y;
}
return Result_Points;
}
传入BEZIER曲线的四个控制点 一静态数组Poly_Points[3],函数将分离出来的曲线上点生成
一动态数组作为返回值,该数组元素的个数保存在变参Count中。

不过我不太懂,想问问阿卷:为什么GETPATH要使用两次,还有:得到的这些点的疏密可否调整?
明天来结束问题。

 
我的测试代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPoint ps[4];
TPoint* pp;
AnsiString s;
int i,Number;
ps[0]=TPoint(30,30);
ps[1]=TPoint(80,80);
ps[2]=TPoint(150,15);
ps[3]=TPoint(420,200);
pp=GetPathPoints(Canvas,ps,Number);
for(i=0;i<=20;i++)
s+=IntToStr(pp.x)+"_"+IntToStr(pp.y)+" ";
Canvas->Polyline(pp,Number-1);
ShowMessage(s);
ShowMessage(IntToStr(Number));
}
 
第一次运用GetPath相当于初始化了;
曲线本质上是由象素点构成的,说的通俗一些,是由折线构成的。
得到的曲线上的点其实就是每段折线的端点,是不可调节的,这是由你曲线的曲率决定了的。
 
懂了,问题该结束了,谢谢阿卷,也谢谢大家,祝考研的人马到成功!
 
顶部