[C++] Canvas


(Sebikom) #1

Witam

Mam taki problem iż rysując kolo funkcja Canvas->Ellipse() podaje sie współrzędne wierzchołków prostokąta i mam takie pytanie jak znaleźć współrzędne rzeczywistego okręgu który został narysowany


(Airborn) #2

współrzędne środka okręgu, czy czego?


(Grzegorz Kwiatek) #3

Ja mam nadzieję, że nie chodziło Ci o współrzędnie środka elipsy, bo to byłaby kompromitacja... Proponowałbym zacząć od matematyki: http://pl.wikipedia.org/wiki/Elipsa_(matematyka), będzie Ci łatwiej napisać własną funkcję obliczającą pozycje punktów na obwodzie elipsy.


(Sebikom) #4

Nie chodzi mi o środek elipsy

Chodzi mi właśnie o wszystkie punkty na obwodzie elipsy


(Grzegorz Kwiatek) #5

No to całe szczęście. Sugeruję zatem skorzystać ze wspomnianej strony wikipedii. Najprostsza dla twojego problemu wydaje się postać parametryczna, robisz pętlę od 0 do 2*pi i obliczasz współrzędne punktów X, Y, zależnych od półosi a,b.


(Sebikom) #6

No tak chyba to będzie działać, tylko jest taki problem ze potrzebuje to na współrzędnych, bo do tego wzoru x=a*sin*t podaje kat i długość pół osi.

Musze mieć podane współrzędne punktu na obwodzie elipsy/okręgu w układzie współrzędnych / formularza.


(Grzegorz Kwiatek) #7

Skoro piszesz że "to chyba będzie działać", to może pochwaliłbyś się kodem który napiszesz - wtedy będziemy dalej dyskutować. Teoretyzować nie musimy... słowo "chyba" jest tutaj nie na miejscu - to będzie działać, tylko trzeba trochę pomyśleć.

Do wzorów podstawiasz dowolny kąt i długość półosi, otrzymujesz współrzędne X i Y punktu leżącego na obwodzie elipsy dla określonego kąta przy zadanych a i b. Czego chcesz więcej, przecież o to Ci chodziło w temacie? Chyba że wyjaśnisz dokładnie o co ci chodzi. Układ współrzędnych formularza jest układem kartezjańskim, wspomniany wzór ten można zastosować dla układu kartezjańskiego:

Punkt P należący do elipsy P=(X,Y) = (a*sin(alfa), b*cos(alfa)),

a długości półosi są bezpośrednio powiązane z parametrami "prostokąta" o których wspominałeś w pierwszym poście. Wpisz sobie elipsę w prostokąt, to zobaczysz.

Pozdrawiam i powodzenia.


(Sebikom) #8

Konkretnie chodzi mi o sytuacje kiedy 2 okregi sie zderzaja

Cos kombinowalem ale niewyszlo, program sie zawiesza

M_PI = 3,14159265358979

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


#include 

#include 

#pragma hdrstop


#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

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


void __fastcall TForm1::Button1Click(TObject *Sender)

{

double x,y,t,rx,ry,rt;


Canvas->Ellipse(10,10,60,60);

Canvas->Ellipse(44,44,94,94);

for (t=0; t<=2*M_PI; t=t+0.00000000000001)

{

        x=25*cos(t)+10;

        y=25*sin(t)+10;

        for (rt=0; rt<=2*M_PI; rt=rt+0.00000000000001)

        {

                rx=25*cos(rt)+44;

                ry=25*sin(rt)+44;

                if ((x==rx)&&(y==ry)) ShowMessage("zderzenie");

        }

}

}

(Grzegorz Kwiatek) #9
  1. Cokolwiek to robi, to pewnie głupieje.

a) Po pierwsze, to czas wykonania wewnętrznej pętli jest okropnie długi (przez mały krok t i rt), wiem co było twoją intencją, ale przekombinowałeś i to nie ma prawa działać prawidłowo. Wewnętrzna pętla wykonać ma się 10000000000000000000000000000 razy. Trochę dużo :wink:

b) po drugie to warunek zderzenia raczej nie będzie spełniony (albo tylko przez przypadek) - wynika to z błędów zaokrąglenia, więc może się zdarzyć, że mimo że teoretycznie okręgi się zderzą - to jednak Twój algorytm tego nie znajdzie...

  1. Skoro to są okręgi, to może po prostu sprawdzić, czy suma promieni jest równa (lub większa...) od odległości pomiędzy środkami tych okręgów, to chyba prostsze, no nie?

(Sebikom) #10

Poprawilem zaraz to po wyslaniu swojego posta xd

Działa - dzięki za pomoc


(Grzegorz Kwiatek) #11

Proszę bardzo, powodzenia.