LineTo(X, Y) i współrzędne punktu docelowego

0

Witam. Chciałbym zrobić tak, abym mógł komendami rysować (jak w LOGO) po Canvas'ie. Tylko nie wiem jak odczytać współrzędne punktu położonego np. na ukos 56° od punktu "0", gdzie to niby mój żółw se siedzi. Na wprost to raczej prosto LineTo(X, Y + 200); jeżeli chce narysować odcinek od dł. 200px. A co właśnie jak chce pod skosem albo w bok? Przecież nie zrobie if'ów na każdy kąt czy nawet kierunek < > ^ V, bo to chyba bez sensu. Rysunek pomocniczy: http://www.iv.pl/images/06586789283669664528.png

0

Istnieje coś takiego magicznego i niezwykłego jak funkcje trygonometryczne, a konkretnie przyda Ci się sinus i cosinus - dzięki nim wyliczysz współrzędne punktu na podstawie jego odległości od środka układu i kąta nachylenia do osi X

0

B.X := A.X + Odl + Sin(Kąt * 180 / Pi);
B.Y := A.Y + Odl + Cos(Kąt * 180 / Pi);

Gdzie A, to punkt względem którego ma być punkt B.
Odl := Odległość między punktami.
Kąt := Kąt względem osi Y, a linją |AB|
Pi := ~ 3.141592

0

No to jak wreszcie będzie poprawnie. Sinusy i cosinusy to dopiero w liceum będą, a ja w gimnazjum ;p byku_guzio tak żyś dopisal, że nie wiem już o co chodzi, proszę napisz poprawny wzór tak jak TomRiddle.

0

Kąt := Kąt względem osi Y, a linją |AB|

Może trochę głupie pytanie, ale jak to obliczyć (sorry, ale 6 klasa szkoły podstawowej i nie wiem za dużo o tych sinusach i cosinusach) ?

0

No to tak. Zakładam, że zaczynamy a punktu A i szukamy punktu B oddalonego od A o odległość d pod kątem b względem osi X:
B.x = d * sin(b) + A.x;
B.y = d * cos(b) + A.y;

kąt b musi być podany w radianach: 1 stopień = PI/180 radianów
Funkcje sin i cos siedzą w math.h

0

OK, teraz rozumiem. Pewnie działa, tylko mam problem ze String i stringstream zajrzał byś do postu obok :)

0

~Refresh
No to tak... Sposobem byku_guzia działa ale co podam inną wartość to w inną stronę leci krecha. Sposobem TomRiddle'a działa prawidłowo, ale nie do końca. Mianowicie kreska rysuje się, ale zawsze pod tym samym kątem. Kod:

if (polecenie == "biegnij")
	{
		frmMain->imgWork->Canvas->MoveTo(frmMain->Lemur.X + wartosc + sin(frmMain->Lemur.Kat * (M_PI / 180)), frmMain->Lemur.Y + wartosc + cos(frmMain-			>Lemur.Kat * (M_PI / 180)));
		frmMain->Lemur.X = frmMain->Lemur.X + wartosc + sin(frmMain->Lemur.Kat * (M_PI / 180));
		frmMain->Lemur.Y = frmMain->Lemur.Y + wartosc + cos(frmMain->Lemur.Kat * (M_PI / 180));
	}
	if (polecenie == "sraj")
	{
		frmMain->imgWork->Canvas->LineTo(frmMain->Lemur.X + wartosc + sin(frmMain->Lemur.Kat * (M_PI / 180)), frmMain->Lemur.Y + wartosc + cos(frmMain-		>Lemur.Kat * (M_PI / 180)));
		frmMain->Lemur.X = frmMain->Lemur.X + wartosc + sin(frmMain->Lemur.Kat * (M_PI / 180));
		frmMain->Lemur.Y = frmMain->Lemur.Y + wartosc + cos(frmMain->Lemur.Kat * (M_PI / 180));
	}

"biegnij" służy do przemieszczania lemura :), a "sraj" do rysowania krechy. frmMain podane zostało dlatego, że to oddzielna funkcja, ale nie moglem jej zaprzyjaźnić z klasą frmMain :( No to dlaczego się tak dzieje? Obojętnię jaką wartość ma Lemur.Kat krecha leci w tą samą stronę...

0

nie:
wartość + ...
zas:
wartość * ...
w 8 miejscach.

Poprawne równanie:
B.X := A.X + Odleglosc * Sin(Kat * Pi / 180);
B.Y := A.Y + Odleglosc * Cos(Kat * pi / 180);

0

Yeah, teraz działa. Dzięki wszystkim. Tylko kąty są dzikie, bo jak dam Kąt = 0 to rysuje w dół, czyli jakby 180.

0

Zamień:
Kat
w równaniach na:
(Kat+Pi*X/360)
gdzie X to kąt o który chcesz obrócić Kąt zerowy.

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