algorytm rysowania: prosta i okrąg

Odpowiedz Nowy wątek
2009-01-12 16:16
Ald
0

Witam, mam do napisania program na grafikę który wyświetli prostą (po podaniu współrzędnej x i y) oraz okrąg (po podaniu współrzędnych x, y oraz promienia r).

Całość jest robiona na Formie, zaznaczam RadioButton (wybór czy ma rysować prostą czy okrąg) i rysuje. To znaczy prostą rysuję bo ją zrobiłem, mam problem z okręgiem, nie mam pomysłu jak go zrobić...

Czy ktoś mógłby mi pomóc?

KOD PROSTEJ:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x1=0,x2=0,y1=0,y2=0;
byte klik = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Image1->Canvas->Pen->Color=clBlack;
Image1->Canvas->Brush->Color=clBlack;

for(int j=0;j<Image1->Height-1;j++)
for(int i=0;i<Image1->Width-1;i++)
{
        Image1->Canvas->Pixels[j][i] = RGB(255,255,255);
}
RadioButton1->Checked = true;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
for(int j=0;j<Image1->Height-1;j++)
for(int i=0;i<Image1->Width-1;i++)
{
        Image1->Canvas->Pixels[j][i] = RGB(255,255,255);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
klik++;
if(klik<=1)
{
        Edit1->Text = x1 = X;
        Edit2->Text = y1 = Y;
}
if(klik > 1)
{
        Edit3->Text = x2 = X;
        Edit4->Text = y2 = Y;
        {
     // zmienne pomocnicze
     int d, dx, dy, ai, bi, xi, yi;
     int x = x1, y = y1;
     // ustalenie kierunku rysowania
     if (x1 < x2)
     {
         xi = 1;
         dx = x2 - x1;
     }
     else
     {
         xi = -1;
         dx = x1 - x2;
     }
     // ustalenie kierunku rysowania
     if (y1 < y2)
     {
         yi = 1;
         dy = y2 - y1;
     }
     else
     {
         yi = -1;
         dy = y1 - y2;
     }
     // pierwszy piksel
     Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
     // oś wiodąca OX
     if (dx > dy)
     {
         ai = (dy - dx) * 2;
         bi = dy * 2;
         d = bi - dx;
         // pętla po kolejnych x
         while (x != x2)
         {
             // test współczynnika
             if (d > 0)
             {
                 x += xi;
                 y += yi;
                 d += ai;
             }
             else
             {
                 d += bi;
                 x += xi;
             }
             Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
         }
     }
     // oś wiodąca OY
     else
     {
         ai = ( dx - dy ) * 2;
         bi = dx * 2;
         d = bi - dy;
         // pętla po kolejnych y
         while (y != y2)
         {
             // test współczynnika
             if (d > 0)
             {
                 x += xi;
                 y += yi;
                 d += ai;
             }
             else
             {
                 d += bi;
                 y += yi;
             }
             Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
         }
     }
        }
        klik = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
x1 = Edit1->Text.ToInt();y1 = Edit2->Text.ToInt();
x2 = Edit3->Text.ToInt();y2 = Edit4->Text.ToInt();

if(RadioButton1->Checked)
{
     // zmienne pomocnicze
     int d, dx, dy, ai, bi, xi, yi;
     int x = x1, y = y1;
     // ustalenie kierunku rysowania
     if (x1 < x2)
     {
         xi = 1;
         dx = x2 - x1;
     }
     else
     {
         xi = -1;
         dx = x1 - x2;
     }
     // ustalenie kierunku rysowania
     if (y1 < y2)
     {
         yi = 1;
         dy = y2 - y1;
     }
     else
     {
         yi = -1;
         dy = y1 - y2;
     }
     // pierwszy piksel
     Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
     // oś wiodąca OX
     if (dx > dy)
     {
         ai = (dy - dx) * 2;
         bi = dy * 2;
         d = bi - dx;
         // pętla po kolejnych x
         while (x != x2)
         {
             // test współczynnika
             if (d > 0)
             {
                 x += xi;
                 y += yi;
                 d += ai;
             }
             else
             {
                 d += bi;
                 x += xi;
             }
             Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
         }
     }
     // oś wiodąca OY
     else
     {
         ai = ( dx - dy ) * 2;
         bi = dx * 2;
         d = bi - dy;
         // pętla po kolejnych y
         while (y != y2)
         {
             // test współczynnika
             if (d > 0)
             {
                 x += xi;
                 y += yi;
                 d += ai;
             }
             else
             {
                 d += bi;
                 y += yi;
             }
             Image1->Canvas->Pixels[x][y] = RGB(0,0,0);
         }
     }
}else
{

}
}
//---------------------------------------------------------------------------

Pozostało 580 znaków

2009-01-12 16:29
Its not me
0

http://en.wikipedia.org/wiki/Circle

Pozostało 580 znaków

2009-01-12 21:22
0

gotowiec:
http://januszg.hg.pl/teksty/g[...]rysowanie_elipsy_i_okregu.zip

Pozostało 580 znaków

2009-01-13 15:29
Ald
0

Hej... najpierw nie miałem tej biblioteki GLUT, a później po instalacji nadal wyskakują błędy w tym programie, staram się napisać swój ale pojęcia nie mam jak to zrobić... czy ktoś umiałby i miał ochotę mi pomóc "przerobić" program napisany pod Delphi na c++ w Builderze?

Pozostało 580 znaków

2009-01-13 15:33
Ald
0

kompilator czepia się każdego :

randomize();

czy to jest dobra komenda? pamiętam że pod pascalem używałem tego jako zaznaczenie że chcę coś losowo wybrać...

Pozostało 580 znaków

2009-01-13 15:58
0

uzyj srand i rand.. juz nie jestes w pascalu.. poza tym, na boga, google


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0