[Wiskunde] pijlen tekenen in het midden.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 22:44
Zoals ik al in een eerder topic had gemeld, mijn Wiskunde is niet geweldig. En ik denk dat ik nu ongeveer hetzelfde toe moet passen (Cos en Sin) om de pijltjes goed in het midden te krijgen. Maar ik kom er niet uit.

Het tekenen van de pijltjes gaat me goed af: ( http://cl.ly/3qUa ) maar zoals je ziet staan ze niet in het midden.

Nu weet ik de volgende waarden:

Hoogte en breedte plaatje
Hoogte en breedte van het pijltje.

Hoe ik ze momenteel teken:

code:
1
2
3
4
5
voor elk pijltje {
   ga naar midden van canvas
   roteer radian vanuit midden
   teken pijl op 0,0 aangezien we al in het midden zijn. 
}


Maar dat werkt dus niet, want dan staan ze er altijd 'net naast'.

Nu dacht ik, dat klopt, want het pijltje heeft een bepaalde breedte, en daarvan moet ik ook weer het midden hebben. Maar toch bleven ze er af staan. Toen dacht ik, uiteraard, ik moet de cos en de sin berekenen van de radian en die vermenigvuldigen met de helft van de breedte van het pijltje.

Dan is het in code zo ongeveer


code:
1
2
3
4
5
6
7
voor elk pijltje {
   ga naar midden van canvas
   roteer radian vanuit midden
   bereken x (pijl.width / 2) * cos(radian)
   bereken y (pijl.width / 2) * sin(radian)
   teken pijl op x,y aangezien we al in het midden zijn. 
}


Maar dan zitten ze er ook nog steeds naast (zoals in het eerste plaatje).

Hoe moet ik dit wel goed doen? Zit er nu al een middag mee te klooien :X
Alvast bedankt.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult er voor moeten zorgen dat je om het goede middelpunt roteert. Dit middelpunt moet de steel van de pijl zijn. Je moet dus zorgen dat bij het roteren dat punt (0,0) is. Dan ga je roteren, en daarna kun je het plaatje verplaatsen zodat het in het midden van je cirkel valt.

Ik vermoed dat je nu een van de hoekpunten van je plaatje als nulpunt gebruikt, en dan roteert het plaatje inderdaad niet precies zoals je wil

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 22:44
Als ik een 1 bij 1 px blokje neerzet op 0, 0 na rotatie staat deze wel altijd in het midden. Volgens mij is de rotatie dan wel goed toch? Of begrijp ik je post verkeerd.

Inderdaad, toch niet. Hoe kan ik dan wel 'goed' roteren? Heb nu top links als 0 punt, dan ga ik naar het midden (285 / 2) voor hoogte en breedte, en roteer daarvanuit.

[ Voor 35% gewijzigd door ZpAz op 03-01-2011 17:37 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
Ik mag aannemen dat je met 'in het midden' bedoelt dat het begin van de pijl netjes in het midden van de zwarte dot zit in het midden (niet het midden van de steel ofzo). Dan zal ik het eens (ook voor mezelf effies) op een rijtje zetten:
  • Je moest eens met een parametervergelijken gaan prutsen. Heb je ook goed gedaan, en het leverde een standaard x1 = cos(T) / y1 = sin(T) op. Met als gevolg een epic rondje.
  • Ga uit van een plaatje met een liggende naar rechts wijzende pijl.
  • We nemen als domein gewoon [0,2pi], het draait rond het middenpunt met periode 2pi.
  • Dan gaan we eerst naar het middelpunt van de uiteindelijke plek van het pijlplaatje. Dit doen we met de paramatervergelijking cos(hoek)/sin(hoek). Invullen levert positie t.o.v. middelpunt op met bereik [-1,1].
  • Dan zetten we op dat punt het plaatje neer, en draaien dat plaatje zelf weer met het aantal graden.
De kern van 't verhaal is eerst middelpunt zoeken en daarna pas plaatje draaien. Volgens mij moet dit werken. ;)

C++:
1
2
3
4
5
6
7
8
9
10
float angledeg = 45.0f; // Zomaar een waarde in deg;
float anglerad = someToRadianFunction(angledeg);

// Bereken middenpunt van plaatje
int centerposx = cos(anglerad); // OUTPUT: 0.5sqrt(2)
int centerposy = sin(anglerad); // OUTPUT: 0.5sqrt(2), oftewel ultiem rechtsbovenin

// Pseudo+, eerst plaatsen, dan draaien
drawTexture(&arrow,centerposx,centerposy);
rotateTexture(&arrow,-anglerad); // Let op de negatieve draairichting plaatje

[ Voor 17% gewijzigd door Orwell op 03-01-2011 18:11 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb even snel een plaatje in elkaar gezet met paint, maar je zult moeten zorgen dat je rotatie als middelpunt de rode cirkel heeft.

Afbeeldingslocatie: http://tweakers.net/ext/f/MWiR5PMr6mS0KcQO2jK1aWXv/full.jpg

Hoe je dat precies doet is een beetje afhankelijk van hoe je roteert. Maar wat je zou kunnen doen is je plaatje eerst zo verschuiven dat dat punt precies op het nulpunt valt, dan roteren en dan verplaatsen naar het middelpunt van je ondergrond.

Je wil immers dat de steel van je plaatje niet van locatie veranderd door je rotatie. Aangezien die 0,0 is kun je daar vermenigvuldigen wat je wil, maar die zal niet verplaatsen :)

[ Voor 18% gewijzigd door Woy op 03-01-2011 18:04 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou gewoon werken met transformaties, en wellicht dat de API waarmee je werkt dat gewoon ondersteunt. Als je pijl een plaatje is van bijv. 100 lang en 10 breed, en in de "natuurlijke" stand recht omhoog, dan zorg je eerst dat de basis van de pijl zich op (0, 0) bevindt. Dat doe je dus met een transformatie van (-5, -100) (want in het plaatje ligt de basis op (5, 100), dus halvewege het midden en onderaan). Vervolgens roteer je de pijl in de goede richting om het centrum. Daarna plaats je de basis van de pijl in het midden van de cirkel, dus met een translatie van, zeg, (50, 50), afhankelijk van waar het midden in het plaatje ligt.

[ Voor 178% gewijzigd door .oisyn op 05-01-2011 01:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 19-09 11:11
(Ik ga hier even van .Net uit)

Bij een lijn kun je toch ook een LineCap specificeren die het pijltje tekent voor je? Als die niet voldoet kun je ook nog een CustomLineCap maken die een eigen pijlpunt tekent. Op die manier hoef je alleen maar een lijn van het middelpunt naar het gewenste punt te trekken zonder je druk te maken over het tekenen van de punt of transformaties.

[ Voor 20% gewijzigd door jip_86 op 05-01-2011 09:29 . Reden: links toegevoegd ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 22:44
Bedankt, ondertussen lukt het pijlen tekenen goed. Maar nu zit ik met een vergelijkbaar probleem als van een eerder topic ( [Wiskunde] - Taartgrafiek en label binnen 'taartstukje' ) maar ik snap niet waar deze fout vandaan komt.

Nu heb ik de pijltjes goed. ( http://cl.ly/3u1A ) maar doet de sinus op de graden radian vreemd, ik dacht dat sinus altijd een getal tussen -1 en 1 terug zou geven, maar bij één getal krijg ik een waarde van minder als -2 terug?

Is mijn verwachting van Math.sin nu fout of?

Hier een screenshot: http://cl.ly/3tzl van de resultaten. Het bovenste getal is de radian, de onderste de sinus ervan. Bij radian 6.2xxxx krijg je een waarde van -2.xxxxx

Math.cos heeft dit niet met dat getal, die blijft netjes tussen -1 en 1.

[ Voor 5% gewijzigd door ZpAz op 06-01-2011 23:15 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

Verwijderd

ZpAz schreef op donderdag 06 januari 2011 @ 23:14:

Hier een screenshot: http://cl.ly/3tzl van de resultaten. Het bovenste getal is de radian, de onderste de sinus ervan. Bij radian 6.2xxxx krijg je een waarde van -2.xxxxx
Nee, -2.44929 x 10-16, ofwel -0.000000000000000244929... zeg maar gerust 0.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 22:44
Ik ben niet wakker blijkbaar, tijd voor mij om te gaan slapen. In ieder geval bedankt!

Tweakers Time Machine Browser Extension | Chrome : Firefox

Pagina: 1