Q&A

  • 반원을 그리는 방법 ?
(50,50) - (200,50) 의 좌표를 기준으로 반원을 그리는 방법을

아시는 분 부탁드립니다.

물론 아래부분에 직선이 그어져서는 안되고요 위로 호만 그리려고 합니다.



답변 부탁드립니다.

4  COMMENTS
  • Profile
    홍성락 2001.08.25 15:27
    초보 wrote:

    > (50,50) - (200,50) 의 좌표를 기준으로 반원을 그리는 방법을

    > 아시는 분 부탁드립니다.

    > 물론 아래부분에 직선이 그어져서는 안되고요 위로 호만 그리려고 합니다.

    >

    > 답변 부탁드립니다.

    ////////////////////////////////////////////////////////////////////

    아래방법을 상용해보세요.

    X를 왼쪽부터 오른쪽으로 그리면 위로 호가 나타나고

    오른쪽에서 왼쪽으로 그리면 아래로 호가 그려집니다.

    procedure TForm1.Button1Click(Sender: TObject);

    var

    xx, yy, X1, X2, Y1, Y2, i, yyy, buho, CX, CY : Integer;

    R_ : Double;

    begin

    Origin.x := strToint(Edit1.text);

    Origin.Y := strToint(Edit2.text);

    xx := strToint(Edit3.text);

    Yy := strToint(Edit4.text);

    with Image1 do begin

    //시작점찾기

    if Origin.x < xx then begin

    X1 := Origin.x;

    X2 := xx;

    y1 := Origin.y;

    y2 := yy;

    buho := 1;

    end

    else begin

    X1 := xx;

    X2 := Origin.x;

    y1 := yy;

    y2 := Origin.y;

    buho := -1;

    end;

    //반자름,중심점

    R_ := sqrt(sqr(X2 - X1) + sqr(Y2 - Y1))/2;

    CX := Round( (X1+X2)/2 );

    CY := Round( (Y1+Y2)/2 );

    canvas.MoveTo(X1, Y1);



    if Origin.y > yy then begin

    for i := X1-CX Downto Trunc(-R_) do begin

    yyy := Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    canvas.LineTo(i+CX, yyy+CY);

    ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    end;

    for i := Trunc(-R_) to X2-CX do begin

    yyy := -Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    canvas.LineTo(i+CX, yyy+CY);

    ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    end;

    end

    else begin

    for i := X1-CX to Trunc(R_) do begin

    yyy := -Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    canvas.LineTo(i+CX, yyy+CY);

    ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    end;

    for i := Trunc(R_) downto X2-CX do begin

    yyy := Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    canvas.LineTo(i+CX, yyy+CY);

    ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    end;

    end;

    end;

    //Refresh;



    end;

  • Profile
    초보 2001.08.29 23:09
    답변에 진심으로 감사드립니다.

    반원이 아닌 일반호를 그릴 경우에 중심점을 어떤 방식으로 계산해야 하는지요 ?

    (일반호 원에서 위부분을 잘랐을 경우의 호 (약 5/1))

    예제를 알려 주시면 감사하겠습니다.

    그럼... 다시한번 진심으로 감사드립니다.





    홍성락 wrote:

    > 초보 wrote:

    > > (50,50) - (200,50) 의 좌표를 기준으로 반원을 그리는 방법을

    > > 아시는 분 부탁드립니다.

    > > 물론 아래부분에 직선이 그어져서는 안되고요 위로 호만 그리려고 합니다.

    > >

    > > 답변 부탁드립니다.

    > ////////////////////////////////////////////////////////////////////

    > 아래방법을 상용해보세요.

    > X를 왼쪽부터 오른쪽으로 그리면 위로 호가 나타나고

    > 오른쪽에서 왼쪽으로 그리면 아래로 호가 그려집니다.

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > xx, yy, X1, X2, Y1, Y2, i, yyy, buho, CX, CY : Integer;

    > R_ : Double;

    > begin

    > Origin.x := strToint(Edit1.text);

    > Origin.Y := strToint(Edit2.text);

    > xx := strToint(Edit3.text);

    > Yy := strToint(Edit4.text);

    > with Image1 do begin

    > //시작점찾기

    > if Origin.x < xx then begin

    > X1 := Origin.x;

    > X2 := xx;

    > y1 := Origin.y;

    > y2 := yy;

    > buho := 1;

    > end

    > else begin

    > X1 := xx;

    > X2 := Origin.x;

    > y1 := yy;

    > y2 := Origin.y;

    > buho := -1;

    > end;

    > //반자름,중심점

    > R_ := sqrt(sqr(X2 - X1) + sqr(Y2 - Y1))/2;

    > CX := Round( (X1+X2)/2 );

    > CY := Round( (Y1+Y2)/2 );

    > canvas.MoveTo(X1, Y1);

    >

    > if Origin.y > yy then begin

    > for i := X1-CX Downto Trunc(-R_) do begin

    > yyy := Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    > canvas.LineTo(i+CX, yyy+CY);

    > ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    > end;

    > for i := Trunc(-R_) to X2-CX do begin

    > yyy := -Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    > canvas.LineTo(i+CX, yyy+CY);

    > ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    > end;

    > end

    > else begin

    > for i := X1-CX to Trunc(R_) do begin

    > yyy := -Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    > canvas.LineTo(i+CX, yyy+CY);

    > ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    > end;

    > for i := Trunc(R_) downto X2-CX do begin

    > yyy := Round( sqrt(sqr(R_)-sqr(i)) ) * buho;

    > canvas.LineTo(i+CX, yyy+CY);

    > ListBox1.Items.Add(intToStr(i)+ ' : ' +intToStr(yyy));

    > end;

    > end;

    > end;

    > //Refresh;

    >

    > end;

  • Profile
    홍성락 2001.09.01 02:24
    초보 wrote:

    > 답변에 진심으로 감사드립니다.

    > 반원이 아닌 일반호를 그릴 경우에 중심점을 어떤 방식으로 계산해야 하는지요 ?

    > (일반호 원에서 위부분을 잘랐을 경우의 호 (약 5/1))

    > 예제를 알려 주시면 감사하겠습니다.

    > 그럼... 다시한번 진심으로 감사드립니다.

    ///////////////////////////////////////////////////////////////////////////

    저도 처음엔 호로 생각했는데 두점만 주워지고 반원,호란 말씀을 혼용해서요.

    호를 그리는 방법으로 3점이 필요한데요, 아래것은 일반적으로 그릴때처럼

    첫번째점(SX,SY)을 시작점, 두번째점(MX,MY)을 그리고자하는
  • Profile
    초보 2001.09.21 21:19
    답변에 진심으로 감사드립니다.