Q&A

  • 화살표를 그려야 하는데......
저는 유체를 전공하는 대학원생입니다.

벡터를 표시해야 하는데 잘되지 않군요.

4사분면과 삼각함수를 이용해서 화살표를 그려보라구 하는데.....

머리가 나쁜지 잘 안되는군요.

김영대님 부탁해요.....

그럼 수고 하세요.

1  COMMENTS
  • Profile
    김영대 1999.10.13 01:26
    moon wrote:

    > 저는 유체를 전공하는 대학원생입니다.

    > 벡터를 표시해야 하는데 잘되지 않군요.

    > 4사분면과 삼각함수를 이용해서 화살표를 그려보라구 하는데.....

    > 머리가 나쁜지 잘 안되는군요.

    > 김영대님 부탁해요.....

    > 그럼 수고 하세요.



    제가 가지고 있던 자료인데 삼각함수를 이용한 화살표 그리는

    예제 소스입니다

    저도 어딘가에서 가져온 소스라 추가 설명을 드릴 수 없고요



    중요한것은 화살표의 head 부분이니

    아래 MyC.Polygon(Slice(ArrowHead,5)); 의 뒤에 있는 숫자 5 를

    1 ~ 5 로 바꾸어 가면서 보시면 각 요소를 분석하기가 쉬워요



    // Button 을 계속 클릭해 보세요

    // 각도에 따라 회전한 화살표가 그려집니다



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ExtCtrls, Math;



    type

    TForm1 = class(TForm)

    Image1: TImage;

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure DrawArrowFill(X,Y: Integer; Bearing: Double; MyC: Tcanvas; Pcolor: TColor);

    var

    R,R1: Double;

    X1,Y1: Integer;

    ArrowHead: array[0..5] of Tpoint; // x,y values

    ArrowTail: array[0..4] of Tpoint;

    begin

    MyC.Pen.Color := ClBlack; // Outline Polygon in Black

    MyC.Pen.Style := psSolid;

    MyC.Pen.Mode := PmCopy;



    MyC.Brush.Color := PColor;

    MyC.Brush.Style := BsSolid;



    R := 10; // Size of arrow can be changed with R and R1

    R1 := R + 5;



    X1 := X + Round(Sin(DegToRad(Bearing))*R1);

    Y1 := Y - Round(Cos(DegToRad(Bearing))*R1); // Point of Arrow



    // Draw the head first

    ArrowHead[0].X := X + Round(Sin(DegToRad(Bearing))*R);

    ArrowHead[0].Y := Y - Round(Cos(DegToRad(Bearing))*R);



    ArrowHead[1].X := X1 + Round(Sin(DegToRad(Bearing+200))*R1);

    ArrowHead[1].Y := Y1 - Round(Cos(DegToRad(Bearing+200))*R1);



    ArrowHead[2].X := X1;

    ArrowHead[2].Y := Y1;



    ArrowHead[3].X := X1 + Round(Sin(DegToRad(Bearing-200))*R1);

    ArrowHead[3].Y := Y1 - Round(Cos(DegToRad(Bearing-200))*R1);



    ArrowHead[4].X := ArrowHead[0].X;

    ArrowHead[4].Y := ArrowHead[0].Y;



    MyC.Polygon(Slice(ArrowHead,5));



    // Draw the shaft

    ArrowHead[5].X := ArrowHead[0].X + Round(Sin(DegToRad(Bearing+180))*R);

    ArrowHead[5].Y := ArrowHead[0].Y - Round(Cos(DegToRad(Bearing+180))*R);



    // Could dump out here if tail not desired.

    MyC.MoveTo(ArrowHead[4].X,ArrowHead[4].Y);

    MyC.LineTo(ArrowHead[5].x,ArrowHead[5].Y); // Draw shaft to Start of Feathers



    // Draw the feathers

    ArrowTail[0].X := ArrowHead[5].X + Round(Sin(DegToRad(Bearing-200))*r1);

    ArrowTail[0].Y := ArrowHead[5].Y - Round(Cos(DegToRad(Bearing-200))*r1);



    ArrowTail[1].X := ArrowHead[0].X + Round(Sin(DegToRad(Bearing+180))*R1);

    ArrowTail[1].Y := ArrowHead[0].Y - Round(Cos(DegToRad(Bearing+180))*R1);



    ArrowTail[2].X := ArrowHead[5].X + Round(Sin(DegToRad(Bearing+200))*R1);

    ArrowTail[2].Y := ArrowHead[5].Y - Round(Cos(DegToRad(Bearing+200))*R1);



    ArrowTail[3].X := ArrowHead[5].X;

    ArrowTail[3].Y := ArrowHead[5].Y;



    ArrowTail[4].X := ArrowTail[0].X; // Close the Polygon

    ArrowTail[4].Y := ArrowTail[0].Y;



    MyC.PolyGon(ArrowTail); // Draw the tail

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    Image1.Canvas.Brush.Color := clWhite;

    Image1.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height));

    Image1.Tag := Image1.Tag + 10;



    DrawArrowFill(Image1.Width div 2,

    Image1.Height div 2,

    image1.Tag,

    Image1.Canvas,

    ClRed);

    end;



    end.