procedure DrawCurve(X, Y: Integer; t: Canvas);     //绘制波浪线的回调函数
var
  pt, ptUp, ptDown:TPoint;
begin
    pt:=Point(X,Y);                          // 这句调试的时候为什么不能正常获得坐标值呢?? x很小,y突然无线增大。。直到返回的两点之间的距离溢出
    if(Form1.PointDistance(pt,CurveLineInfo.ptEnd)<=1.0) and (CurveLineInfo.PointIndex=0) then      //该画直线了
       Form1.Image4.Canvas.Pixels[pt.X,pt.Y]:=RGB(0,0,0)
    else
    begin
    if(CurveLineInfo.PointIndex = 2) then
    begin
      Form1.Image4.Canvas.MoveTo(CurveLineInfo.ptLast.X, CurveLineInfo.ptLast.Y);
   // t.MoveTo(CurveLineInfo.ptLast.X, CurveLineInfo.ptLast.Y);
      ptUp:= Form1.CalPointWithDistance(CurveLineInfo.ptBegin,pt,1.5,0);
      Form1.Image4.Canvas.LineTo(ptUp.X, ptUp.Y);
  //  t.LineTo(ptUp.X, ptUp.Y);
      CurveLineInfo.ptLast := ptUp;
      CurveLineInfo.bLineUp := False;
      CurveLineInfo.PointIndex := CurveLineInfo.PointIndex-1;
    end
    else if(CurveLineInfo.PointIndex = -2) then
    begin
      Form1.Image4.Canvas.MoveTo(CurveLineInfo.ptLast.X, CurveLineInfo.ptLast.Y);
  //  t.MoveTo(CurveLineInfo.ptLast.X, CurveLineInfo.ptLast.Y);
      ptDown := Form1.CalPointWithDistance(CurveLineInfo.ptBegin,pt,1.5,2);
      Form1.Image4.Canvas.LineTo(ptDown.X, ptDown.Y);
  //  t.LineTo(ptDown.X, ptDown.Y);
      CurveLineInfo.ptLast := ptDown;
      CurveLineInfo.bLineUp := True;
      CurveLineInfo.PointIndex := CurveLineInfo.PointIndex+1;
    end
    else if (CurveLineInfo.bLineUp = True) then
    begin
      CurveLineInfo.PointIndex := CurveLineInfo.PointIndex+1;
    end
    else if (CurveLineInfo.bLineUp = False) then
    begin
      CurveLineInfo.PointIndex := CurveLineInfo.PointIndex-1;
    end;
  end;  
end;前面有定义的CurveLineInfo结构体变量,PointDistance求两个点的距离,
CalPointWithDistance是求从起点到终点的一条直线上,距离终点距离为自定义值的
点,参数0和2表示分别表示距离左端点距离为定义值的点、距离右端点距离为定义值的点。
LineDDA函数调用回调函数过程如下
LineDDA(起始点X坐标,起始点Y坐标, 终点X坐标, 终点Y坐标, @DrawCurve, LongInt(Canvas));
1.假设起点(0,0) 终点(50,50),调用的时候第一次回调函数返回的X,Y值应该是(0,0),
然后是(1,1),然后(2,2——……(50,50)吧?
可是为什么我的回调函数中 pt:=Point(X,Y) 得到的坐标不正常呢?后面都没法做下去了。。
假设回调函数是正确的,就算不正确,pt:=Point(X,Y)也放在函数最前端,可是返回值就是不对。。郁闷了
2.还有就是回调函数似乎不能正常结束,因为回调过程结束后我还有语句Image4.Canvas之类的语句,
执行的时候却提示访问冲突。。
3.再就是回调函数中我加前注的程序行,如果我想用t.canvas 代替Form1.Image4.Canvas的话,
应该如何定义回调函数的第3个参数呢? LineDDA调用的时候又应该如何写最后一个参数呢?哪位高手能帮帮小弟?困惑了好久了。。

解决方案 »

  1.   

    procedure DrawCurve(X, Y: Integer; t: Canvas);     //绘制波浪线的回调函数类型声明错误,应该是t:TCanvas
      

  2.   

    好长,慢慢看,首先一点:
    这个函数最好做通用一点,既然有了Canvas,那么函数体里面就不应该出现Form1.可能你要判断两点间的距离,
    完全没必要把这个函数写在form1里面.
      

  3.   

    既然有回调,感觉好象是用来画随时间变化的曲线的函数.
    首先,通过LineDDA 告诉对方程序,回调函数的地址和canvas, 对方每得到一组坐标后,就会利用你给的回调函数DrawCurve来画一种的一段线?是这样吗?
      

  4.   

    呃。。就是画成曲线的样子,波浪线。 关于波浪线信息的结构体定义如下:
    type
      CURVE_LINE_INFO = Record
      ptBegin, ptLast, ptEnd: TPoint;   // 回调函数新获得的(x,y)值不断赋给ptLast,就是说ptLast从起点ptBegin逐渐接近终点ptEnd。
      bLineUp: Boolean;      //波浪线下一个点是上升还是下降
      PointIndex: Integer;   
    end;
    var  CurveLineInfo: CURVE_LINE_INFO;CalPointWithDistance(CurveLineInfo.ptBegin,pt,2,0) 实现的功能是寻找从CurveLineInfo.ptBegin(起点)开始
    到pt(终点)为止的线段上,以pt点为圆心做圆,(CurveLineInfo.ptBegin, pt这两个点连起来的线段相当于圆的半径)
    距离圆心2个单位的点。最后一个参数可以是0,1,2,3 分别表示点的位置分别在pt点的左边、上边、右边、下边。当然位置是
    相对于CurveLineInfo.ptBegin, pt这两个点练成的线段方向来说的。
    根据bLineUp的取值分别在起点和终点 之间波动,看了图你就明白了。。关键是我不能取得正常的pt值,回调函数怎么没发挥作用呢? 奇怪
    明天给你图吧。。不会上传
      

  5.   

    图片的地址:
    http://sz3.photo.store.qq.com/http_imgload.cgi?/rurl4_b=51dc795b4de4f5811136c4d4b9fd3b7e3049901b96db1795c992787b8395070b44ca05ef6ab61c6021a4954e9473edd6bafb234c2f93134670a7835be19b5d22c12cba9768802f03f8c0def1fb87972df7a6e1f7