Toon posts:

[C#] X / Y berekenen op Cirkel.

Pagina: 1
Acties:
  • 942 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ok, Ik weet hier zijn mega veel voorbeelden van en die heb ik dan ook 1 voor 1 allemaal uit gelezen. Toch maak ik nog steeds een fout.

Ik heb een cirkel en wil in die cirkel een lijn trekken. Deze lijn moet getrokken worden van graad 30 op de cirkel naar graad 210 op de cirkel.

Nu heb ik dit om m'n punten te berekenen:
code:
1
2
3
4
5
6
7
8
9
10
double hoek = 30 * Math.PI /180;
double straal = center/2+30;
double PuntX = Math.Round(Math.Cos(hoek) * straal);
double PuntY = Math.Round(Math.Sin(hoek) * straal);
Point pnt1 = new Point(Convert.ToInt32(PuntX), Convert.ToInt32(PuntY));
hoek = 42 * Math.PI / 180;
PuntX = Math.Round(Math.Cos(hoek) * straal);
PuntY = Math.Round(Math.Sin(hoek) * straal);
Point pnt2 = new Point(Convert.ToInt32(PuntX), Convert.ToInt32(PuntY));
g.DrawLine(new Pen(Color.Brown, 3), pnt1, pnt2);


Let nu even niet op de slordigheid van m'n code a.u.b. Ik ben nu aan het testen om het later dan goed neer te zetten....

Volgens mij moet het goed zijn wat ik nu gedaan heb alleen krijgt hij de verkeerde coördinaten door. Hij begint ergens midden in de cirkel inplaats van op de 30ste graad van de cirkel. en het eindigen lukt net zo min.

Nu vond ik 3 fomules die ik nodig had:
Eerste was om de hoek te berekenen:
hoek = graden * PI / 180

Dan om de coördinaten te berekenen:
Px: cos(hoek) * straal;
Py: sin(hoek) * straal;

Zoals je in m'n code kan zien heb ik die er ook in staan.

Hier een plaatje van wat ik nodig heb:
Afbeeldingslocatie: http://www.rapid-gaming.com/voorbeeld.png

Graag met veel uitleg.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12 14:13
Je zegt zelf al dat je slordig bezig bent. Dat lijkt me ook de oorzaak van je probleem. Schrijf het eens netjes op. Hoe zou je het aanpakken als je de punten A en B op een wiskundeproefwerk moest uitrekenen?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op donderdag 25 augustus 2005 @ 15:38:
Je zegt zelf al dat je slordig bezig bent. Dat lijkt me ook de oorzaak van je probleem. Schrijf het eens netjes op. Hoe zou je het aanpakken als je de punten A en B op een wiskundeproefwerk moest uitrekenen?
Naja. Als ik die formules opschrijf kloppen ze na mijn idee.

WiskundeProefwerk... Das minstens 4 a 5 jaar terug dat ik dat voor het laatst gehad heb..

[ Voor 4% gewijzigd door Verwijderd op 25-08-2005 15:44 ]


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je hebt het over 30 en 210 graden. In je code kom ik 30 en 42 graden tegen, en in je plaatje 120 en 300 graden. Ik denk dat je inderdaad eerst moet bedenken wat je precies wilt.

In je tekening ga je er volgens mij al wel vanuit dat graden linksom gemeten worden, zoals het hoort. Als startpunt neem je alleen een straal die van het middelpunt naar boven gaat, terwijl je moet meten vanaf een straal die naar rechts wijst.

[ Voor 3% gewijzigd door GlowMouse op 25-08-2005 15:46 ]


Verwijderd

Als ik het mij nog goed herinner, moet het eerder "oorsprong cirkel + straal*cos(90+hoek)" zijn.
De formule die jij gebruikt is voor een cirkel die op de oorsprong =(0,0) ligt en waarvan 0° het meeste rechtse punt van de cirkel is.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
IDD het meest rechtse punt van de cirkel is 0 graden en de graden lopen linksom dan kan je gewoon met
Sinus( hoek ) * straal = Overstaand zijde = y
Cosinus( hoek ) * straal = Aanliggende zijde = x

de x en y coordinaat ten opzichte van de oorsprong van je cirkel berekenen. Je moet er dan nog wel rekening mee houden dat de y negatief is als de hoek > 180 graden is en de x negatief tussen de 90 en 270 graden.

[ Voor 11% gewijzigd door Woy op 25-08-2005 15:59 ]

“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.”


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12 14:13
Waarom moet je rekening met een negatieve x of y houden?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10 22:03

MrSleeves

You'll thank me later.

MSalters schreef op donderdag 25 augustus 2005 @ 16:00:
Waarom moet je rekening met een negatieve x of y houden?
Omdat er altijd de kleine hoek teruggeven wordt.
Je moet dus rekening houden met het kwadrant en de x- en y-waarden daarop aanpassen.
Als je een hoek hebt van 45 graden, ligt deze in het eerste kwadrant wat in de wiskunde een positieve x- en y-waarde betekent (t.o.v. de oorsprong).
Let ook op dat bij wiskunde de y-as omhoog positief is en bij het tekenen met Graphics precies andersom.
Dus bij 45 graden is de y-waarde negatief t.o.v. de oorsprong.

Heb je voor het tekenen een transformatie doorgevoerd om de oorsprong op een bepaalde plek te zetten? Anders zie je alleen het vierde kwadrant van je plaatje.

[ Voor 44% gewijzigd door MrSleeves op 25-08-2005 16:11 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MSalters schreef op donderdag 25 augustus 2005 @ 16:00:
Waarom moet je rekening met een negatieve x of y houden?
Nee dat hoeft idd niet. Ik zat even teveel in plaatjes te denken maar je Sinus en Cosinus worden al netjes negatief dus dat hoeft helemaal niet.

“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.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-12 23:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

rwb schreef op donderdag 25 augustus 2005 @ 15:55:
IDD het meest rechtse punt van de cirkel is 0 graden en de graden lopen linksom dan kan je gewoon met
Sinus( hoek ) * straal = Overstaand zijde = y
Cosinus( hoek ) * straal = Aanliggende zijde = x
De gangbare wiskundige definitie is idd dat je rechts begint en tegen de klok in draait. Let er echter op dat in diezelfde wiskunde de y-as meestal positief naar boven loopt, itt de coordinaten op je scherm die positief naar beneden lopen. Je krijgt met de standaard cos en sin dan een draaiing met de klok mee ipv tegen de klok in.
de x en y coordinaat ten opzichte van de oorsprong van je cirkel berekenen. Je moet er dan nog wel rekening mee houden dat de y negatief is als de hoek > 180 graden is en de x negatief tussen de 90 en 270 graden.
Je hoeft er toch geen rekening mee te houden? Tel het resultaat op bij je de coordinaten van je middelpunt en je hebt de juiste locatie op de cirkel.

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-12 23:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

MrSleeves schreef op donderdag 25 augustus 2005 @ 16:05:

Omdat er altijd de kleine hoek teruggeven wordt.
Je moet dus rekening houden met het kwadrant en de x- en y-waarden daarop aanpassen.
Als je een hoek hebt van 45 graden, ligt deze in het eerste kwadrant wat in de wiskunde een positieve x- en y-waarde betekent (t.o.v. de oorsprong).
Let ook op dat bij wiskunde de y-as omhoog positief is en bij het tekenen met Graphics precies andersom.
Dus bij 45 graden is de y-waarde negatief t.o.v. de oorsprong.
Je bent in de war met de tan functie om coordinaten om te zetten naar de hoek (waarbij je dus hoek = tan(y / x) doet, en dat geeft idd altijd een kleine hoek). Dat werkt de andere kant op dan wat hier de bedoeling is :). Overigens heb je in veel talen wel iets als een atan2() functie waarbij je de x en y los van elkaar kunt geven en de functie zelf die logic doet om het kwadrant te bepalen.

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.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op donderdag 25 augustus 2005 @ 16:18:
[...]


Je bent in de war met de tan functie om coordinaten om te zetten naar de hoek (waarbij je dus hoek = tan(y / x) doet, en dat geeft idd altijd een kleine hoek).
Dat was idd ook even waar ik mee in de war was :)

“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.”


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10 22:03

MrSleeves

You'll thank me later.

rwb schreef op donderdag 25 augustus 2005 @ 16:14:
[...]

Nee dat hoeft idd niet. Ik zat even teveel in plaatjes te denken maar je Sinus en Cosinus worden al netjes negatief dus dat hoeft helemaal niet.
Hmm.. is dat zo.. foutje dan..

Maar wat je ook zou kunnen doen is de ruimte waarin je tekent kunnen verplaatsen en roteren. Dan hoef je eigenlijk alleen maar een horizontale lijn te trekken. :)
Je maakt een GraphicsPath met de lijn.
Dan maak je een Matrix die je met Scale, Transform en RotateAt.
Vervolgens laat je de Matrix los op het GraphicsPath en dan teken je de GraphicsPath op de Graphics.
Het is een beetje uitproberen (ik heb nog wel ergens een voorbeeldje in VB.NET).
Gevonden:
code:
1
2
3
4
5
6
7
8
9
10
11
Dim temp As Drawing2D.GraphicsPath = Me.Wijzer.Clone

Dim trans As New Drawing2D.Matrix
trans.Translate(center.X, center.Y)
trans.Scale(size.Width * 0.5 * Me.WijzerRadius, size.Height * 0.5 * Me.WijzerRadius)
temp.Transform(trans)
trans.Reset()
trans.RotateAt(Angle, center)
temp.Transform(trans)

g.DrawPath(p, temp)

Wijzer is een Graphicspath met een tekeningtje met de punt naar links. Omdat het scalen later plaatsvindt zijn de x- en y-waarden tussen de -1 en +1.
In dit geval is de size de grote van de cirkel en de WijzerRadius de grote van de wijzer (voor jou niet van toepassing).
rwb schreef op donderdag 25 augustus 2005 @ 16:19:
[...]

Dat was idd ook even waar ik mee in de war was :)
Ik ook dus.. Heb ooit een metertje en een kompas gemaakt waarbij je met de muis een waarde aan kon geven. Dan heb je dus een x en een y en dan moet je de hoek eruit halen. Dan gaat het andersom. :)

Als ik die straal-waarde zie, klopt daar niet zoveel van.
Is de coördinaat van het midden van de cirkel (center, center)?
Dan is je straal eerder center/2 - 30 (met 30 de marge aan de zijkant).
De oorsprong voor je berekening is dus ook (center, center).
Dus bij pnt1 en pnt2 moet je ook (center, center) optellen.

[ Voor 51% gewijzigd door MrSleeves op 25-08-2005 16:46 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
GlowMouse schreef op donderdag 25 augustus 2005 @ 15:45:
Je hebt het over 30 en 210 graden. In je code kom ik 30 en 42 graden tegen, en in je plaatje 120 en 300 graden. Ik denk dat je inderdaad eerst moet bedenken wat je precies wilt.

In je tekening ga je er volgens mij al wel vanuit dat graden linksom gemeten worden, zoals het hoort. Als startpunt neem je alleen een straal die van het middelpunt naar boven gaat, terwijl je moet meten vanaf een straal die naar rechts wijst.
De gradens komen idd niet overeen. .. In de code deed ik inderdaad 30 en 42.. was om te testen.. in m'n plaatje is het wel 30 naar 210.. Graden gaat tegen de klok in.
MrSleeves schreef op donderdag 25 augustus 2005 @ 16:21:

Als ik die straal-waarde zie, klopt daar niet zoveel van.
Is de coördinaat van het midden van de cirkel (center, center)?
Dan is je straal eerder center/2 - 30 (met 30 de marge aan de zijkant).
De oorsprong voor je berekening is dus ook (center, center).
Dus bij pnt1 en pnt2 moet je ook (center, center) optellen.
Het leuke is. Ik heb ook gewoon een rechte lijn laten trekken van 0 graden naar het midden om zeker te zijn of dit klopte... (center/2, center/2) das exact het midden van de cirkel. die 30 was even om wat te testen. foutje.

Als ik doe wat jij zegt: "De oorsprong voor je berekening is dus ook (center, center)." krijg ik de lijn niet in beeld.
Met mijn code krijg ik wel de code in beeld alleen zwerft deze overal doorheen.
Verwijderd schreef op donderdag 25 augustus 2005 @ 15:50:
Als ik het mij nog goed herinner, moet het eerder "oorsprong cirkel + straal*cos(90+hoek)" zijn.
De formule die jij gebruikt is voor een cirkel die op de oorsprong =(0,0) ligt en waarvan 0° het meeste rechtse punt van de cirkel is.
Sorry maar hoe bedoel je dit?

Het figuur dat ik gebruikte als voorbeeld heb ik express zo getekent met de assen. Dit omdat beide waardens gewoon positief zijn. Dus Y=200 of iets anders.. geen -200.
rwb schreef op donderdag 25 augustus 2005 @ 15:55:
IDD ....

Sinus( hoek ) * straal = Overstaand zijde = y
Cosinus( hoek ) * straal = Aanliggende zijde = x
Dat heb ik dan toch ook? Alleen gaan ik van een 0 Graden punt uit die bovenaan ligt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12 14:13
.oisyn schreef op donderdag 25 augustus 2005 @ 16:18:
[...]
Je bent in de war met de tan functie om coordinaten om te zetten naar de hoek (waarbij je dus hoek = tan(y / x) doet, en dat geeft idd altijd een kleine hoek). Dat werkt de andere kant op dan wat hier de bedoeling is :). Overigens heb je in veel talen wel iets als een atan2() functie waarbij je de x en y los van elkaar kunt geven en de functie zelf die logic doet om het kwadrant te bepalen.
tan(fi) = sin(fi)/cos(fi) en rekent dus hoeken om in verhoudingen. Je bedoelt arctangens, oftewel inverse tangens, oftewel atan. Die rekent verhoudingen om naar hoeken. Overigens zou je ook asin/acos kunnen gebruiken, die rekenen ook die kant op.

TS heeft een hoek en heeft (x,y) nodig => cos,sin

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-12 23:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

euh ja, idd, typo :)

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.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik heb een keer een dingetje in dhtml gemaakt dat lissajous figuurtjes tekent (typisch zaterdagmiddag ik-verveel-me-brouwsel). Kijk eens naar de source, misschien heb je er wat aan.

http://www.melp.nl/wiskunde/lissajous.html

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 25 augustus 2005 @ 17:23:

[...]
Dat heb ik dan toch ook? Alleen gaan ik van een 0 Graden punt uit die bovenaan ligt.
Als je op deze manier rekent dan gaat dat nou eenmaal uit van een 0 graden punt dat rechts ligt.
Math.Cos( 0.0 ) levert nou eenmaal 1 op en Math.Cos( Math.PI ) = -1. Als je wilt dat het 0 graden punt boven ligt zul je eerst je graden moeten converteren. Dus je moet er dan 90 graden bij tellen of in radialen 1/4 PI

“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.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-12 23:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

Of, aangezien je de y toch al moest negaten om een tegen de klok in richting te krijgen:
x = -r * sin (a)
y = -r * cos (a)

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.

Pagina: 1