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
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
współrzędne środka okręgu, czy czego?
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.
Nie chodzi mi o środek elipsy
Chodzi mi właśnie o wszystkie punkty na obwodzie elipsy
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.
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.
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.
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");
}
}
}
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
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…
Poprawilem zaraz to po wyslaniu swojego posta xd
Działa - dzięki za pomoc
Proszę bardzo, powodzenia.