Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了德尔福 – 直线和三角形边的交点大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
要求的分数是红色的.
我使用delphi绘制它.
with Image1.Canvas do
begin
Image1.Canvas.Pen.Color :=RGB(255,0);
    MoveTo(30,3); // 1
    LineTo(260,10);// 1-2
    LineTo(100,100);//2-3
    LineTo(30,3);//3-1
Image1.Canvas.Pen.Color :=RGB(0,255);
    MoveTo(20,80);//4
    LineTo(300,40);//4-5

end;

解决方法

既然你已经在使用GDI(Canvas),你也可以使用区域,这是一个例子:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  Canvas: TCanvas;
  T1,T2: arraY[0..2] of TPoint;
  R1,R2: HRGN;
  Buffer: PRgnData;
  BufferSize: Cardinal;
  P: PRect;
  I: Integer;
  Pt1,Pt2: TPoint; // result intersection points
begin
  Canvas := (Sender as TPaintBoX).Canvas;

  // first triangle region
  T1[0] := Point(100,100);
  T1[1] := Point(260,10);
  T1[2] := Point(30,3);
  R1 := CreatePolygonRgn(T1[0],3,ALTERNATE);
  if R1 = 0 then
    RaiseLastOSError;
  try
    // show the first triangle as red (not needed for computation)
    Canvas.brush.Color := clRed;
    FillRgn(Canvas.Handle,R1,Canvas.brush.HandlE);

    // second triangle region    
    T2[0] := Point(20,80);
    T2[1] := Point(300,40);
    T2[2] := Point(100,100);
    R2 := CreatePolygonRgn(T2[0],ALTERNATE);
    if R2 = 0 then
      RaiseLastOSError;
    try
      // show the second triangle as green (not needed for computation)
      Canvas.brush.Color := clGreen;
      FillRgn(Canvas.Handle,R2,Canvas.brush.HandlE);

      // determine thE intersecTing region    
      if CombineRgn(R1,RGN_AND) = ERROR then
        RaiseLastOSError;
      // show intersection as yellow (not needed for computation)
      Canvas.brush.Color := clYellow;
      FillRgn(Canvas.Handle,Canvas.brush.HandlE);

      // determine the needed buffer size    
      Buffer := nil;
      BufferSize := GetRegionData(R1,Buffer);
      // allocate buffer and get region data (array of rectangles)
      Buffer := AllOCMem(BufferSizE);
      try
        if GetRegionData(R1,BufferSize,Buffer) = 0 then
          RaiseLastOSError;

        // enumerate all rectangles and find points with leftmost and rightmost X    
        P := @Buffer^.buffer[0];
        Pt1 := P^.TopLeft;
        Pt2 := Point(P^.Right,P^.Top);
        for I := 0 to Buffer^.rdh.nCount - 1 do
        begin
          if P^.Left < Pt1.X then
            Pt1 := P^.TopLeft;
          if P^.Right > Pt2.X then
            Pt2 := Point(P^.Right,P^.Top);
          Inc(p);
        end;

        // connect the points with a blue line (not needed for computation)
        Canvas.Pen.Color := clNavy;
        Canvas.MoveTo(Pt1.X,Pt1.Y);
        Canvas.LineTo(Pt2.X,Pt2.Y);

        // output result points (not needed for computation)    
        Canvas.brush.Color := Self.Color;
        Canvas.Font.Color := clWindowText;
        Canvas.TextOut(8,108,Format('Pt1: %d,%d,Pt2: %d,%d',[Pt1.X,Pt1.Y,Pt2.X,Pt2.y]));
      finally
        FreeMem(Buffer);
      end;
    finally
      deleteObject(R2);
    end;
  finally
    deleteObject(R1);
  end;
end;

这将产生以下结果:

大佬总结

以上是大佬教程为你收集整理的德尔福 – 直线和三角形边的交点全部内容,希望文章能够帮你解决德尔福 – 直线和三角形边的交点所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。