Dwa pytanka o linie/wektory

0

No więc tak mam dwa problemy. Załóżmy że mam record-linie np.

[code]Linia=record
Start,End:TPoint;
end;[/code]

I teraz:

  1. Jak sprawdzić czy dwie linie sie przecinają (wiem, to już było ale nie mam zamiaru szukać w bilionach postów)

  2. Jak skonwertować linie na taki rekord i vice versa:

[code]Linia2=record
Start:TPoint;
Kierunek:Integer/Real;
Dlugosc:Integer/Real;
end;[/code]

0

<font color="green">No więc tak mam dwa problemy. Załóżmy że mam record-linie np.

Linia=record
Start,End:TPoint;
end;

I teraz:

  1. Jak sprawdzić czy dwie linie sie przecinają (wiem, to już było ale nie
    mam zamiaru szukać w bilionach postów) </span>

Gdzie tu dwie linie widzisz: to są dwa punkty, które mogą być końcami wektorów - a te z kolei się nie przecinają.

<font color="green">2. Jak skonwertować linie na taki rekord i vice versa:

Linia2=record
Start:TPoint;
Kierunek:Integer/Real;
Dlugosc:Integer/Real;
end;</span>

Użyj współrzędnych biegunowych.

Jeżeli masz jakiś punkt P na układzie współrzędnych, np. [3,4], to wartość "3" określa współrzedną x-owną, a "4" : y-kową. Trzeba je zamienić :

<font color="blue">x = dlugosc * cos (a);
y= dlugosc * sin(a);</span>

dlugosc to odległość punktu od środka układu współrzędnych, a "a" to kąt pomiędzy wektorem a osią OX.

0

Ad 1. Ja tylko przykład recordu podałem. Niech więc mam:

Lin1,Lin2:Linia;

I jak sprawdzić czy się przecinają??

Ad 2. Spoko, ale jak zrobić w drugą stronę??

0

Nie jestem pewien ale chyba wystarczy sprawdzić:

<font color="blue"> Linia=record Start,End:TPoint; end;

var
s1,s2:Linia;

begin
if s2.Start.Y < s1.Start.Y then
begin
if s2.End.Y > s1.End.Y then // przecinają się
else // nie przecinają się
end;

if s2.Start.Y > s1.Start.Y then
begin
if s2.End.Y < s1.End.Y then // przecinają się
else // nie przecinają się
end;

end;

end;</span>

Ale jak mówie: wymysliłem to na szybkiego i nie jestem pewny.

0

A w sprawie 2?

(Ja tam z matmy cienki jestem i wszysko na forum daje)

0
<font color="blue"> dlugosc := sqrt ((s1.Start.X - s1.End.X)2 + (s1.Start.y - s1.End.y)2)</span>
0

jezeli masz linie wykorzystaj to i przekonwertuj to jako prostą zeby znalezc wykres funkcji.
teraz tak endpos twojej lini wzgledem osi OX pozycja (np. [byle jaka, 0])
to do obliczenia kata czyli kierunku wykrozystaj arctan
dlugosc mozna obliczyc poprzez znany wzor pierwiastek z x1-x2 do kwadratu plus y1-y2 do kwadratu, wszystkie te zeczy i jeszcze inne obsluguje moj unit ale udostpenie go dopiero p tym jka przypomne sobie jak sie robilo takie cos zebysmy wiedzieli czy funkcje sie przecinaja, aha jeszcze jedna uwaga linia ma swoja dlugosc to ulatwia sprawe :>

0

Dokładnie. Kąt możesz policzyć tak:

alfa := arctan((Linia.End.Y - Linia.Start.Y) / (Linia.End.X - Linia.Start.X));

0

A jak by ktoś to tak do kupy zebrał? (Wiem, wybrzydzam)

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