Q&A

  • 캔버스에서 화살표 그리기.
이미지 캔버스에서 화살표를 그릴려고 하는데요..

LineTO 메서드를 통해 직선을 그려지지만..

화살표는 그려지지가 않네요..

캔버스에서 제공하는 여러 메서드를 찾아봐도..방법이 안나와서요.

혹시. 이미지 캔버스에서 화살표를 그리는 방법..아시는 분 있으세요??

직선을 그리고. 직선을 그린 상태에서 꼭지점을 다시 직선을 통해 그려서.화살표로 표현을 할려고도..

했지만. 여러 경우(선이 그려지는 방향)에 따라 모양이 이상하게 변하네요.

조언을 부탁드립니다.

감사합니다.
3  COMMENTS
  • Profile
    우소 2006.04.19 21:22
    전에 해본건데..
    사인그래프 그리기
    원그리기
    화살표 그려 마우즈 위치에 따라 화살표 방향 바꿔서  그립니다.



  • Profile
    박상윤 2006.04.19 17:06
    <!--CodeS-->
    //------------------------------------------------------------------------------//
    //  직선의 기울기가 Atan 함수의 특성으로 x=0 경계로
    //  기울기 값이 대칭 되므로
    //  180도 변환값을 넣어 주어야 함     x>0
    //  1번 기본 변환 ,기본 변환 +180 이동 변환  x<0;
    //  좌우로 이동한 값을 구하여 3점으로 삼각형을 그림
    //  Use 절에 Math 추가.. 하세요
    //------------------------------------------------------------------------------//
    procedure TForm1.PanitLine;
      var
       ArrowPoint:TPoint;
       ArrowIntercept:Double;
       i,j,k:Integer;
       Par:integer;
       Slope:Double;
    begin
     
        Slope:=0.0;
        with Canvas  do
         begin

          //라인 그리기
           MoveTo(StartPt.X,StartPt.Y);
           Lineto(endPt.X,EndPt.Y);

           Par:=(Pen.Width*2+1)*2;

            //기울기 구하기
            if (endPt.X- StartPt.X)<>0 then
            Slope:=arcTan((StartPt.Y-EndPt.Y)/(StartPt.X-endPt.X))
            else Slope:=0;

               //화살표 그리기
               if (LineArrowType=ltStartArrow)or(LineArrowType=ltBothArrow)then
               begin

                   // X <0
                   if ((StartPt.X-endPt.X)<0) then
                   begin

                      MoveTo(StartPt.X,StartPt.Y);
                      Lineto( StartPt.X +trunc(Par*cos(Slope)-( Par/2.0*sin(Slope))),
                              StartPt.Y +trunc(Par*sin(Slope)+( Par/2.0*cos(Slope))));
                      Lineto( StartPt.X +trunc(Par*cos(Slope)+ (Par/2.0*sin(Slope))),
                              StartPt.Y -trunc(Par/2.0*cos(Slope)-( Par*sin(Slope))));
                      Lineto(StartPt.X,StartPt.Y);

                   end
                   //X>0
                   else if((StartPt.X-endPt.X)>0) then
                   begin

                        MoveTo(StartPt.X,StartPt.Y);
                      Lineto(StartPt.X +trunc(-Par*cos(Slope)-( Par/2.0*sin(Slope))),
                             StartPt.Y +trunc(-Par*sin(Slope)+( Par/2.0*cos(Slope))));
                      Lineto(StartPt.X +trunc(-Par*cos(Slope)+ (Par/2.0*sin(Slope))),
                             StartPt.Y -trunc(Par/2.0*cos(Slope)+( Par*sin(Slope))));
                      Lineto(StartPt.X,StartPt.Y);

                   end;
               end ;

               if (LineArrowType=ltEndArrow) or (LineArrowType=ltBothArrow) then
               begin
                   //
                   if ((StartPt.X-endPt.X)<0) then
                   begin
                      MoveTo(endPt.X,endPt.Y);
                      Lineto(endPt.X +trunc(-Par*cos(Slope)-( Par/2.0*sin(Slope))),
                             endPt.Y +trunc(-Par*sin(Slope)+( Par/2.0*cos(Slope))));
                      Lineto(endPt.X +trunc(-Par*cos(Slope)+ (Par/2.0*sin(Slope))),
                             endPt.Y -trunc(Par/2.0*cos(Slope)+( Par*sin(Slope))));
                      Lineto(endPt.X,endPt.Y);

                   end
                   else if((StartPt.X-endPt.X)>0) then
                   begin

                      MoveTo(endPt.X,endPt.Y);
                      Lineto( endPt.X +trunc(Par*cos(Slope)-( Par/2.0*sin(Slope))),
                              endPt.Y +trunc(Par*sin(Slope)+( Par/2.0*cos(Slope))));
                      Lineto( endPt.X +trunc(Par*cos(Slope)+ (Par/2.0*sin(Slope))),
                              endPt.Y -trunc(Par/2.0*cos(Slope)-( Par*sin(Slope))));
                      Lineto(endPt.X,endPt.Y);

                   end;
               end ;

              
        end;


    end;

    <!--CodeE-->
  • Profile
    홍성호 2006.04.19 22:01
    감사합니다..^^