[Algorytm] Skalowanie

0

user image

Mam figure wyjsciowa ABCD, i teraz chce "pociagajac" za wierzcholek A i przesuwając go do pkt. A' Otrzymać przeskalowaną figurę A'B'CD'. Probowalem juz to robic na rozne sposoby. Wie ktos jak tego dokonac najszybciej ? Moze jest jakas macierz do tego przygotowana ?

Właściwie rozwiazanie sprowadza sie do obliczenia wektorów zielonego i niebieskiego, a czerwony mam dany. Jest takze wzor na obliczenie kata miedzy wektorami, ktory zapewne by sie przydal w tym przypadku ale nie wiem jak to wykorzystac...

0

Dla jasności oznaczmy wektor czerwony, zielony i niebieski odpowiednio jako c, z, i n
Wg mnie wygląda to tak (chyba, że się gdzieś pomyliłem :p):
Masz kąt między wektorami c i n.

Z trygonometrii wiemy, że
cos(kat) = |n|/|c|
więc
|n| = cos(kat) * |c|

Gdyby odcinek CB był równoległy do osi to nie byłoby większego problemu ? wtedy:
B?x = Bx+|n|
B?y = By

Ale natura chciała inaczej, więc niech jej będzie :D
Potrzebny jest nam kąt (nazwijmy go betą) jaki tworzy prosta przechodząca przez odcinek CB z osią OX. Wiemy z lekcji matematyki, ze tangens z tego kąta to współczynnik a tej prostej.

Równanie prostej przechodzącej przez dwa punkty:
y ? Cy = (x-Cy) * ( (By-Cy) / (Bx-Cx) )
// ten nawias po * to współczynnik a jak ktoś nie wiedział ;p

skoro
tg(beta) = a
zatem
beta = tg(-1) // tg(-1) to nie jest ctg() choć może tak to wygla z początku !!!

Jak już mamy kąt beta to korzystając z funkcji trygonometrycznych jesteśmy w stanie obliczyć współrzędne naszego punktu. Tak więc:

B?x = Bx + cos(beta)
B?y = By + sin(beta)

Współrzędne punktu D? liczymy analogicznie.

Jeżeli gdzieś się pomyliłem, albo coś nie jest jasne to pisz ? na kartce wygląda ok, ale nie mam w głowie debuggera =)

0

szczerze mowiac to rozumiem do tego miejsca '|n| = cos(kat) * |c|' ale z tego co wiem to cos kata miedzy wektorami nie jest rownt |n| / |c|... wzialem knige braciaka ze studiow i tam jest cos takiego :

user image

Zastanawiam sie po co w ogóle ten kat miedzy odcinkiem BC a osia OX... ?

"Wiemy z lekcji matematyki, ze tangens z tego kąta to współczynnik a tej prostej" - tak sie sklada ze ja tego nie wiem, teraz ide dopiero do 2 klasy LO wiec tego jeszcze nie mialem... :P I jakbys mogl to postaraj sie to wytlumaczyc troche jasniej tak lopatologicznie :P

EDIT :
piszesz

B?x = Bx + cos(beta)
B?y = By + sin(beta)

cos wydaje mi sie ze tu nie gra przeciez cos i sin ma wartosc z przedzialu -1 do 1 tak wiec jesli dodamy do wspolrzednej Bx zauzmy ze 1 to przesuniemy ten wierzcholek o 1 pixel w prawo, troche malo :P Nie rozumiem w ogole wszystkich tych zabiegow :P

0
  1. jeżeli chodzi o ten kąt, to mówimy o czymś innym. Ty napisałeś o iloczynie skalarnym wektorów, a ja o stosunku boków trójkąta - zauważ, że podzieliłem moduły (długości) wektorów. Pominąłem iloczyn skalarny, bo zrozumiałem, że znasz ten kąt, ale przed chwilą looknąłem na górę i spostrzegłem moją nadinterpretację :P

  2. jeżeli chodzi o ten tangens (tutaj), to dziwne, że tego nie miałeś - btw. też idę teraz do drugiej LO (Topolówka)

  3. przejrze jeszcze raz i postaram się poprawić, może nawet zrobie jakieś rysunki w paint'cie :)

B?x = Bx + cos(beta)
B?y = By + sin(beta)

powinno być
B?x = Bx + cos(beta) * m
B?y = By + sin(beta) * m

Lookne uzupełnie i wrzuce, ale raczej jutro się nie uda, więc najwcześniej pojutrze, cya ;)

[<font color="green">dopisane</span>]
wektor m to wektor niebieski...

0

Ok. No z tymi tangensami to w tej szkole normalne ze jeszcze nie mielismy, strasznie z materialem do tylu jestesmy... musze uczyc sie na wlasna reke z neta i z ksiazek braciaka (tyle ze w tych studenckich ksiazkach to tak lopatologicznie nie wytlumacza :P).
Wczoraj troche nad tym siedzialem wieczorkiem i chyba znalazlem rozwiazanie tylko nie wiem czy dobre, jak przyjde dzis z budy (znowu sql :() to zapodam co wymyslilem. Obliczanie nowych wspolrzednych odbywa sie w 6 krokach, troche duzo :/ ale nie wiem czy to w ogóle dziala :P (na kartce wszystko ladnie wyglada :P a debugera tez w glowie nie mam :P). Zreszta wiecej napisze jak wroce...

0

Matematyka 1, Cewa, Krawczyk, Kruk, wyd. Podkowa

z takiej książki się uczyliśmy w pierwszej klasie. Łatwa do samodzielnego przerobienia - polecam samouczkom, którzy mają zaległości z matmy. Do niej jest zbiór zadań. Poziom jest na ogół wysoki, a i trafi się czasem jakieś zadanie dal asów.

Dobra lecę na rozpoczęcie...

0

Ok pisze moje rozwiazanie:

  1. Obliczamy cos kata miedzy wektorem AD i wektorem CZERWONYM. Mozemy to zrobic bo mamy dane oba te wektory.

  2. Nastepnie obliczamy kat miedzy wektorem CZERWONYM a wektorem NIEBIESKIM. Jest on rowny 180 minus kat z pkt. 1. A w tym przypadku mamy cos kata z pkt. 1 to wystarczy zmienic tylko znak cos (Łatwo to sprawdzic na wykresie fun. cos). Czyli jesli cos kata z 1 pkt. wynosil 0,7 to cos miedzy wektorem CZERWONYM i NIEBIESKIM bedzie wynosil -0,7.

  3. OK, mamy juz kat, teraz zabieramy sie za wektory. Obliczamy dlugosc wektora CZERWONEGO.

  4. Teraz patrzymy na wektory CZERWONY NIEBIESKI i ZIELONY tworza one trojkat w ktorym mamy dane: dlugosc wektora CZERWONEGO i kat miedzy wektorem CZERWONYM i NIEBIESKIM ( a raczej cos tego kata, sin tez latwo obliczyc, bo w szkole byl taki wzor cos2 + sin2 = 1 ). Tak wiec w takim trojkacie obliczamy sobie dlugosc wektora NIEBIESKIEGO. Po przeksztalceniu wzoru na cos bedzie to wygladalo tak : NIEBIESKI = CZERWONY * cos ( kata )

  5. Obliczamy teraz jaki kat tworzy odcinek CB z osia OX ( tu wlasnie ta Twoja wskazowka mnie naprowadzila na rozwiazanie mojego problemu, mam nadzieje ze wlasciwie ). Nazwijmy ten kat gamma.

  6. I teraz majac sin i cos kata gamma mozna obliczyc wektor NIEBIESKI. Analogicznie postepujemy z wektorem ZIELONYM. Teraz jak tak patrze na to co napisalem to wydaje mi sie to torche podobne do Twojego rozwiazania ale jest wiele roznic, jesli chodzi o wzory.

Ale jakbys mogl to przeanalizowac i stwierdzic czy tak jest dobrze... to bylbym wdzieczny. Ale jednak nadal mnie kusi zeby to zrobic jeszcze szybciej. Z tego co wiem na macierzach mozna zrobic kazda operacje matematyczna na wektorach. Bo niejako macierz jest zbiorem wektorow. I pomnozenie takiej macierzy przez inna macierz moze dac szybciej obliczony wynik.

Jeszcze jedna mysl przyszla mi do glowy jakby to mozna obliczyc szybciej ale nie wiem czy sa na to wzory. Jesli wezmiemy sobie wektor AB i inny wektor AB ktory bedzie wektorem AB przesunietym o wektor CZERWONY. I teraz majac te dwa wektory zastanawiam sie czy nie mozna by obliczycz odleglosci miedzy wektorami. Bo byl na macie wzor na odleglosc miedzy prostymi rownoleglymi, a wiec moze jest wzor na odleglosc miedzy wektorami. Wtedy wlasciwie byly by tylko 2 dzialania do wykonania...

0

Obliczamy cos kata miedzy wektorem AD i wektorem CZERWONYM.
[...]
obliczamy kat miedzy wektorem CZERWONYM a wektorem NIEBIESKIM.

:d policzyłeś kąt, który miałeś, że tak powiem. Zamiast liczyć kąta między AD i CZERWONYM policz kąt między wektorem DA i CZERWONYM

AD 5: robisz to jakoś inaczej niż ja "u góry" ?

Jeżeli chodzi o macierze to może byłoby szybciej, ale ja umiem policzyć jedynie wyznacznik macierzy i pobrać macierze z OpenGL (mam co prawda w książce pokazane przekształcenia na macierzach, ale nie wczytywałem się w to jeszcze). Być może szybsze byłyby też kwaterniony, ale o tych to wiem tyle, że są lepsze od macierzy i nic więcej.

Nie wiem w czym Twoje rozwiązanie jest inne od mojego :)
Zauważ, jakie czynności wykonujemy:

  1. liczymy kąt między DA i c (wektor czerwony)
  2. liczymy długość wektora niebieskiego
  3. liczymy przekształcenie (konkretnie obrót) wektora niebieskiego względem globalnego układu współrzędnych.
  4. pkty 2 i 3 powtarzamy dla wektora zielonego

Zauważ, że piszesz bardziej ogólnikowo ode mnie - przykładowo w punkcie pierwszym nie wiadomo jak liczysz ten kąt (z iloczynu skalarnego? z równania prostych? może jeszcze jakoś inaczej?). Wzorów użyłeś innych, ale czy mniej kosztownych to nie wiem - trzeba by to sprawdzić, ale różnica i tak nie będzie jakoś kosmicznie istotna, bo to przecież nie gra typu rzeczywistego, co nie ;)

Jesli wezmiemy sobie wektor AB i inny wektor AB ktory bedzie wektorem AB przesunietym o wektor CZERWONY. I teraz majac te dwa wektory zastanawiam sie czy nie mozna by obliczycz odleglosci miedzy wektorami.

hmmm... AB==A"B" [???] jeżeli chodzi Ci o odleglość między nimi to będzie to długość wektora czerwonego, z tym że ja wiem o co Ci chodzi, ale matematycznie (jak zapisałem wyżej) wektory AB i A"B" są identyczne, bo dane określające wektor to długość, kierunek i zwrot - nie ma mowy o punkcie początkowym i końcowym. Swoją drogą Ty chyba dałeś się zwieść rysunkowi, czyż nie? Wektor AB nie jest równy A'E
user image
jeżeli się mylę, to napisz coś więcej o tym drugim rozwiązaniu. To pierwsze, które wspólnie ustaliliśmy wydaje mi się poprawne, ale dopóki nie sprawdzę, to nie dam sobie głowy uciąć ;) pozdro

0

No to tak: Kat miedzy wektorem CZERWONYM a AD obliczam z tego wzoru :
user image
Ktory daje nam cos kata miedzy tymi wektorami. Aha i jaka jest roznica miedzy katem pomiedzy wektorami CZERWONYM i AD a CZERWONYM i DA ? :)

Kata miedzy wektorem CB a osia OX licze z tego samego wzoru co powyzej... chociaz teraz przyszlo mi do glowy ze mozna to zrobic szybciej, wykorzystujac tylko wzor na cos kata w trojkacie prostokatnym...
cos ( gamma ) = CB.x / |CB|
gdzie
CB.x wpolrzedna x wektora CB, czyli przyprostokatna przy kacie gamma
|CB| dlugosc wektora CB, czyli przeciwprostokatna trojkata

Co do drugiego sposobu to nie zasugerowalem sie rysunkiem, zalaczam troche poprawiony rys.
user image

Ten zolty 'wektor' to wektor AB przesuniety o wektor CZERWONY, czyli ten zolty wektor to wektor A"B", tak sobie to oznaczylem w poprzednim poscie... i teraz zastanawiam sie czy da sie miedzy tymi dwoma wektorami obliczyc odleglosc...

kwaterniony - nie slyszalem o czyms takim, ale musze poczytac :) byc moze sie przyda

EDIT : tfu sorry w tym drugim rozwiazaniu nie wktory tylko odcinki, bo wektory te sa identyczne. Czyli odleglosc miedzy odcinkami, lub wektor miedzy odcinkami.

0

Ta różnica to właśnie ten minus ;-]

|CB| dlugosc wektora |CB|

? popraw, bo daje po oczach...

Odległość, o którą pytasz da się policzyć (wzorek z książki, o której wspomniałem wcześniej):

Jeżeli dwie proste dane są równaniami kierunkwymi y=ax+b to:
d=(|b1-b2|) / ((1+a2)0.5)

Te proste muszą być równoległe, po wsp.a jest ten sam dla obu prostych!
Jak już pewnie ten wzorek liczy trochę co innego, ale zawsze możesz policzyć tą odległość sprawdzając odległości poszczególnych (kazdy z każdym) punktów - złożoność O(n^2), ale w tym przypadku to 4, więc niewiele :d

0

Hmm ty podales wzor na odleglosc od prostych, wlasciwie to chyba tak zrobie bo to bedzie zapewne szybsze niz 1 sposob i o wiele latwiejsze do zaimplemenotwania w c++. Czyli kolejne kroki wygladalyby mniej wiecej tak :

  1. Najpierw obliczamy wzor prostej przechodzacej przez dwa pkt tj. A i B oraz wzor prostej przechodzacej przez pkt. A" i B". ( ale przed tem trzeba wyznaczyc te pkt. A" i B" przesuwajac pkt. A i B o wektor CZERWONY )
  2. Obliczamy odleglosc miedzy prostymi.
  3. Obliczamy jaki kat tworzy wektor CB z osia OX ( kat gamma )
  4. A nastepnie majac cos, sin kata gamma i odleglosc miedzy prostymi obliczamy ostateczny wektor. Ten 4 krok mozna zilustrowac mniej wiecej tak :
    user image

wszystko wydaje sie dzialac poprawnie... chyba tak nie ? :)

PS. O co chodzi w tym ostatnim Twoim zdaniu ? Zlozonosc n^2 ? :| :P

EDIT: Cholera mam problem, bo wzor na prosta przechodzaca przez dwa pkt. wyglada tak

( y - y1 ) = ( x2 - x1 ) / (y2 - y1 ) * ( x - x1 )

niby wszystko matematycznie latwo obliczyc ale jak tu obliczyc za pomoca komputera, zreszta tutaj wszystko dodatkowo komplikuje ze wzor ten zwraca prosta w postaci ogulnej Ax + By + C = 0. Pisze moze cos o tym w tej Twojej ksiazce ? :)

0

( y - y1 ) = ( x2 - x1 ) / (y2 - y1 ) * ( x - x1 )

a nie przypadkiem ( y - y1 ) = (y2 - y1 ) / ( x2 - x1 ) * ( x - x1 ) [???]

Zlozonosc O(n^2) - no taką ma złożoność, czyli czas wykonywania narasta wg tego wzoru (n*n). Nie wiem jak Ci to inaczej wytłumaczyć. Polookaj na stronach o algorytmach (tzw. notacja dużego 'O')

tmp=(y2 - y1 ) / ( x2 - x1 );
y = tmpx + (-x1tmp) + y1
czyli zupełnie jak y=ax+b

czyli masz zwykłą funkcję y=f(x). Nieznasz tylko y (x jest parametrem, a cała reszta to wpółczynniki). Więc w czym problem?

Całość wydaje się działać poprawnie ;) ale nigdy nie wiadomo do końca. Jak zrobisz jakiś przykład z wykorzystaniem tego, to chciałbym to zobaczyć (w akcji) ;D

0

a nie przypadkiem ( y - y1 ) = (y2 - y1 ) / ( x2 - x1 ) * ( x - x1 )

Hmm byc moze, tak mialem tylko zapisane w zeszyciec, zapewne zle spisalem, zreszta jak sobie podstawialem do mojego wzoru to jakies glupoty mi wychodzily wiec pewnie twoj musi byc wlasciwy.

tmp=(y2 - y1 ) / ( x2 - x1 );

y = tmpx + (-x1tmp) + y1 :|

Jak to otrzymales ?
tmp = a ? czemu ?

no i czemu
(-x1*tmp) + y1 = b ?

Wyczytales to w ksiazce czy miales na lekcji ? Bo jak na lekcji to zaczne watpic w moja szkole lub matematyczke (chociaz w matematyczke to juz zwatpilem dawno :P)

Jak zrobisz jakiś przykład z wykorzystaniem tego, to chciałbym to zobaczyć (w akcji) ;D

OK, oczywiscie ze pokaze :)

0

[???] Twoje pytanie o mal nie powaliło mnie z krzesła (w sensie nie wiem do jakiej Ty szkoły chodzisz), bo ja nie zrobiłem nic nadzwyczajnego - zaledwie kilka przekształceń... więc tak:

mamy wzór (w każdej literaturze winien być http://www.google.pl/search?q=prosta+przechodz%C4%85ca+przez+dwa+punkty postaci:
( y - y1 ) = (y2 - y1 ) / ( x2 - x1 ) * ( x - x1 )
inaczej (również z literatury) ( y - y1 ) = a * ( x - x1 )

żeby nie myliło się z 'a' nazwałem zmienną pomocniczą jako 'tmp'
tmp = (y2 - y1 ) / ( x2 - x1 );

czyli mamy
( y - y1 ) = tmp * ( x - x1 )

przeniosłem -y1 na prawą stronę, żeby mieć postać parametryczną y(x):
y = tmp * ( x - x1 ) + y1

na koniec wymnożyłem przez tmp (tylko po to, żeby pokazać, że jest to równanie prostej), jeżeli chcesz liczyć na komputerze, to nie musisz wymnażać - nawet nie powinieneś, bo zamieniasz 1 odejmowanie i 1 mnożenie na 2 mnożenia (katastrofa, bo mnożysz liczby zmiennoprzecinkowe ;)) i 1 dodawanie), więc mamy:
y = tmpx + (-x1tmp) + y1
\ / \ /
y = a * x + b

jeżeli nie czujesz do końca o co chodzi, to albo pytaj albo zakup książkę o której wspomniałem - na prawdę można się z niej trochę nauczyć :)

0

Hmm szczerze mowiac to nie wiedzialem o czyms takim :

( y - y1 ) = a * ( x - x1 )

ale teraz sobie sprawdzilem i zeczywiscie tak jest :P. Ale jak mowilem my jestesmy strasznie do tylu, dopiero teraz mamy funkcje liniowa co powinno byc juz rok temu... ale oczywiscie bylo to tez chyba w gimnazjum ale mniej dokladnie. OK tak wiec zobacze co z tego wyjdzie. na razie zbytnio czasu nie mam, ale jak tylko cos sie znajdzie to wprowadze to do kompa i pokaze jak dziala :)

0

Ale pogmatwaliście. Najprościej tak:

DANE: A, B, C, D, zatem łatwo znaleźć wektory CD, CB, CA; wektor AA'
liczymy
wektor CA' = CA + AA'
skala x = CA'x / CAx
skala y = CA'y / CAy

CB'x = CBx * skala x
CB'y = CBy * skala y
CD'x = CDx * skala x
CD'y = CDy * skala y

to tyle jak do twojego przypadku, a teraz ogólniej o skalowaniu:

(n - n'ta wspórzedna, jej zakres zalezy od ilości wymiarów)

DANE: Vn - skala w kirunku n'tego wersora (dla 2wymiarów n = {x, y} lub {1, 2}; punkt S - punkt względem którego skalujemy.

teraz szukając nowych współrzędnych każdego wystarczy wykonać:

P-punkt do skalowania, P'-P zeskalowany

P'n = (Pn - Sn) * Vn + Sn
(Pn - Sn) - odległość punktu P od S w n'tym wymiarze;
Vn - skala dla n'tego wymiaru;
(Pn - Sn) * Vn - zeskalowana odległość
(Pn - Sn) * Vn + Sn - zeskalowana odległość + punkt S = punkt P'

0

wektor CA' = CA + AA'
skala x = CA'x / CAx
CB'x = CBx * skala x

jeżeli punkt A' jest bezpośrednio nad punktem C, to wtedy:
CA'x = 0 => skala x = 0 => CB'x = 0
a tak przecież nie jest (chyba, że się mylę) - wydrukuję i jutro oblookam dokładnie to, co napisałeś ;)

pozdrawiam, AklimX

0

Spróbuj dobrać taki układ odniesienia, że OX || CB a OY || CD, lub na odwrót.
Musisz uważać jeszcze na CAx=0, CAy=0, więc gdy CAx=0 to CA'x musi być też zero( bo jak skalujesz 0 przez jakąś skale to i tak bedzie zero, inaczej mówiąc skalując wzdłuż osi OY punkty leżące na osi OX nie są przesunięte).

A więc: licząc skale przy takich danych -> środek C, XOY wzdłuż DCB, A, AA' to

  1. CAn <> 0 i CA'n <> 0 => skala n = CA'n / CAn
  2. CAn = 0 i CA'n = 0 => skala n = 1
  3. CAn = 0 i CA'n <> 0 => skalowanie niemożliwe dla podanych danych

Przy zmianie układu i liczeniu nowych współrzednych przyda ci sie macierz obrotu
| cosx -sinx |
| sinx cosx |

0

Skalowanie pod określonym kątem z określonym środkiem i skalą można przedstawić za pomocą kilku transformacji (przekształceń), potrzebne nam będą

1. Translacja (przesunięcie)
TR(V, W) - przesunięcie wektora V o wektor W

TR(V, W) = V + W = [ Vx+Wx, Vy+Wy ]

2. Skalowanie
SK(V, X) - zeskalowanie wektora V o skale X ze środkiem skalowania w punkcie (0, 0)

SK(V, X) = [ VxXx, VyXy ]

3. Obrót
OB(V, fi) - obrót wektora V w lewo o kąt fi:

OB(V, fi) = [ Vxcos(fi) - Vysin(fi), Vxsin(fi) + Vycos(fi) ]

SKS(V, X, fi, S) skalowanie wektora V o skale X, w kierunku fi, o środku skalowania S

Aby wykonać tą operacje na wektorze V musimy go kolejno:
-przesunąć o wektor [-Sx, -Sy]
-obrócić o kąt -fi
-zeskalować o skale X
-obrócicć o kąt fi
-przesunąć o wektor [Sx, Sy]

SKS(V, X, fi, S) = TR(OB(SK(OB(TR(V, [-Sx, -Sy]), -fi), X), fi), [Sx, Sy])

z twoich danych odpowiednio wynika
sin(fi) = (By - Cy) / |BC|
cos(fi) = (Bx - Cx) / |BC|
trzezba jeszcze policzyć skale X
Xx = OB(CA', fi)x / OB(CA, fi)x
Xy = OB(CA', fi)y / OB(CA, fi)y

0

licząc skale przy takich danych -> środek C, XOY wzdłuż DCB, A, AA' to

co to znaczy środek C [???]
XOY wzdłuż DCB - jeżeli dobrze rozumiem to OX || CB [???] jeżeli tak, to tego topicu by nie było...
tego dalej (A, AA') nie jarze, o co z tym chodzi?

jak możesz to napisz trochę dokładniej, bo to 'n' jest strasznie mylące (nie wiem czy chodzi o każdą składową za każdym razem, czy może jakoś inaczej)

0

Witam ponownie, dawno mnie tu nie bylo bo w szpitalu lezalem... ale teraz moge wrocic do pracy. adf88 tak więc to co pisałeś

wektor CA' = CA + AA'
skala x = CA'x / CAx
skala y = CA'y / CAy

CB'x = CBx * skala x
CB'y = CBy * skala y
CD'x = CDx * skala x
CD'y = CDy * skala y

dotyczy tylko prostokąta który ma boki rownolegle do osi ? do obroconego juz nie dziala ? To na razie jedyne pytanie :P

EDIT : Dobra sam sobie odpowiedzialem na to pytanie i tak wlasnie jest... piszesz dalej ze mozna to zrealizowac za pomoca roznych transformacji (translacja,obrot itp.). To byłoby najprostsze rozwiazanie ale nabardziej czasochonne dla procesora, a mi zalezy na szybkosci... Tak wiec chyba pozostane przy rozwiazaniu ktore podrzucil AklimX

0

Hmmm, te czynności są tak proste, że dla procesora to będzie mały pikuś... a może lepiej inaczej ? Na twoim miejscu porównałbym kod dla obu rozwiązań, może sie okazać, że bedzie tak samo dla obu przypadków.
A po rozpisaniu
SKS(V, X, fi, S) = TR(OB(SK(OB(TR(V, [-Sx, -Sy]), -fi), X), fi), [Sx, Sy])
może sie ten wzór jeszcze skróci.

0
  1. nie wiem, czy jszcze aktualne
  2. nie wiem, czy nie było już takiej propozycji, bo nie chciało mi się czytać całości :P, ale z tego co zauważyłem to nikt nie podał tak (bez obliczania kątów itp)

punkt A masz dany więc obliczasz równanie a) prostej BC b) prostej DC to ze wzoru y - y1 = ((y2 - y1) / (x2 - x1)) * (x - x1) c) prostej AB d) prostej AD`
to ze wzoru y - y1 = a * (x - x1), gdzie a = a prostej równoległej do liczonej (a = (y2 - y1) / (x2 - x1) )

Masz teraz równania 4 prostych bedących bokami powiększonego prostokąta. Wystarczy teraz zrobić dwa ukady równań z równań prostych

BC
AB
i otrzymasz po rozwiązaniu wsp. pkt. B`

CD
AD
i otrzymasz po rozwiązaniu wsp. pkt. D`

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