Új hozzászólás Aktív témák
-
cocka
veterán
Na de most akkor tisztázzuk már. A kis piros szakaszok hossza, amiket a piros és zöld karika határol, ismert?
Mert akkor felírod a piros és zöld pontok távolságát, aztán egyenlővé teszed a kis piros hosszával.
Na de ezzel még korántsincs vége. Ha ugyanis adott a kis piros hossza, akkor azt el jelölheted r-nek és mivel alfa adott máris kész a polárkoordináta-rendszered amiből a következőképp számolható a piros karika koordinátája.
Mivel r hossza ismert az ábrán a kis piros karikából merőlegest állítasz a fekete mondjuk k egyenesre. Ez az egyenes a k-t elmetszi valahol, ekkor ez a metszéspont és a szöghöz közelebbi zöldvégpont adja az á szakaszt. A bét pedig a piros karikát és az új metszéspontot összekötő szakasz adja. Tehát kapsz egy derékszögű háromszöget, amiben igaz az, hogy
tg alfa = b/a és a másik egyenletet pedig abból kapod, hogy r^2=a^2+b^2 Ebből a két egyenletből megkapod a-t és b-t vagyis a kérdéses pont koordinátáit. Na most hogy ez a gondolatkísérlet tényleg működik-e vagy sem, azt ki kell próbálni.
Konkrét értékek is vannak a feladatban vagy csak annyit írnak, hogy adott ez meg amaz, de konkrétum semmi?
-
Jester01
veterán
Simán a fekete szakasz szögét kiszámolod majd ez alapján a piros vektorokat legyártod elforgatással és szépen hozzáadod a kívánt végponthoz.
Kb így:
adott: P0(x0, y0), P1(x1, y1), r és alfa
szakasz szöge beta = atan2(y1 -y0, x1 - x0)
nyíl szögek gamma0 = beta + alfa, gamma1 = beta - alfa
elforgatott hegy Q0(x2, y2) = (r * cos(gamma0), r * sin(gamma0))
Q1(x3, y3) = (r * cos(gamma1, r * sin(gamma1))
eltolt nyílhegyek végpontja:
R0 = P1 - Q0 = (x1 - x2, y1 - y2)
R1 = P1 - Q1 = (x1 - x3, y1 - y3)Kész. Annyi trükk van benne, hogy beta számolásnál figyelni kell a helyes koordináta negyedre (ezért használtam atan2-t) illetve a piros szakaszok helyett azok ellentettjét könnyebb számolni ezért a kivonás a végén.
Itt egy példakód C#-ban:private Gdk.Point GetHalfArrow(Gdk.Point P1, double gamma, int r)
{
Gdk.Point Q = new Gdk.Point((int)(r * Math.Cos(gamma)), (int)(r * Math.Sin(gamma)));
Gdk.Point R = new Gdk.Point(P1.X - Q.X, P1.Y - Q.Y);
return R;
}
private void DrawArrow(Gdk.Point P0, Gdk.Point P1, int r, double alpha)
{
double beta = Math.Atan2(P1.Y - P0.Y, P1.X - P0.X);
Gdk.Point R0 = GetHalfArrow(P1, beta + alpha, r);
Gdk.Point R1 = GetHalfArrow(P1, beta - alpha, r);
// draw 3 lines: P0-P1 for body, P1-R0 and P1-R1 for the head
}Jester
Új hozzászólás Aktív témák
- iPhone topik
- Sorozatok
- Diablo 3
- Villanyszerelés
- Kerékpárosok, bringások ide!
- Újabb Samsungok telepíthetik a Galaxy AI-t
- bb0t: Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- Mindent megtudtunk az új Nokia 3210-ről
- Milyen billentyűzetet vegyek?
- Képeken az egyik kameráját elvesztő Sony Xperia 10 VI
- További aktív témák...
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest