[Vb6] X, Y punten op een circel berekenen

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

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor het antwoord lees onderaan deze post of op de derde pagina mijn post.. houdt wel rekening ermee dat de computer in radialen reken en dat dat nog niet is aan gepast in mijn code

Mijn probleem is dus eigenlijk. Ik zet een punt neer in een circel. Nu kan het voorkomen dat er 2 punten over elkaar heen komen. Dit mag niet gebeuren en daarvoor wil ik hem over diezelfde rand van de circel ergens anders plaatsen.

Maar het lukt mij maar niet om uit te vinden hoe ik die niewue X en Y punten bereken.
Ik heb het forum al eens doorzocht maar ik kan dus geen informatie vinden die me verder brengt dan dat ik al ben..

een plaatje.. en wat code...

Afbeeldingslocatie: http://www.xs4all.nl/~hhouben/Circle.jpg

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
If frmSettings2.msfgStudentsFrequentie.Text = "x" Then ' voorwaarde 2 (meisje)
        iI = 0
        frmSettings2.msfgStudentsFrequentie.Col = Vraag
        frmSettings2.msfgStudentsFrequentie.Row = i
        score = frmSettings2.msfgStudentsFrequentie.Text
        
        If score = 0 Then
            Y = (picSocio.Width / 2) / (iMantwoord + 1)
        Else
            Y = ((picSocio.Width / 2) / (iMantwoord - 1) * score)
        End If
        X = picSocio.Height / 2
        
        iI = Mid$(sStemmen, score + 1, 1) + 1
        Mid$(sStemmen, score + 1, 1) = CStr(iI)
        
        If Y = 300 Then Y = 290
        
        X = X + (((300 - Y) * Cos(45 * (300 - Y)))) + 45 / 5
        Y = Y - (((300 - Y) * Sin(45 * (300 - Y))))
        
        picSocio.FillColor = vbBlue
        picSocio.FillStyle = 0
        picSocio.Circle (Y, X), 10, vbBlue, , , 1
        picSocio.PSet (Y - 6, X - 7), vbBlue
        picSocio.ForeColor = RGB(255, 255, 255)
        picSocio.Print i
        sLeerPos(i) = CStr(Y) & ":" & CStr(X)
        picSocio.FillStyle = 1
    End If


De code waar ik dus mee in de knoop zit is

code:
1
2
      X = X + (((300 - Y) * Cos(45 * (300 - Y)))) + 45 / 5
      Y = Y - (((300 - Y) * Sin(45 * (300 - Y))))


deze code is dus al 100 keer veranderd en he tlukt me maar niet.
Meer informatie nodig? gewoon even vragen.. danku

edit.. vergeten..
code:
1
2
X = 300 + (300 - Y * Math.Cos(45 * Pi / 180))
Y = 300 - (300 - Y * Math.Sin(45 * Pi / 180))


Dit schijnt te werken maar hij plaats alles te ver naar buiten ..

Oplossing
code:
1
2
3
4
5
6
'code zoals in mijn project
       Xx = (300 - Y) * Cos(10)
        Yy = (300 - Y) * Sin(10)
        
        X = Xx + 300
        Y = Yy + 300


300 - y is de straal..
+ 300 omdat het middelpunt 300 , 300 (pixel is)
code:
1
2
3
4
'formule zoals ie gebruikt moet worden in andere projecten, r als in straal.

x = r * cos(hoek)
y = r * sin(hoek)


en het werkt...
Een cursus Goniometrie is niet overbodig vooor mij..
ik zal het antwoord ook even in mijn openings post zetten dat andere het snel gevonden hebben..

Tnx to Janos en Bloog

[ Voor 26% gewijzigd door Verwijderd op 07-03-2005 14:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Eehm het is mij niet helemaal duidelijk wat je wilt bereiken.
Wat voor figuur ben je aan het tekenen? Wil je elke keer als je een overlappende pixel neerzet er eentje een pixel naar buiten plaatsen?
Kun je dan ook in een array bijhouden welke pixels je geplaatst hebt en dan je plaatsingsalgoritme rustig naar buiten laten wandelen totdat hij een leeg plekje vindt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee. Je moet die X op het plaatje zien als de plaats waar een figuur getekend word.

Dat figuurtje moet aleen niet altijd op die plaats van X getekend worden maar zeg maar op die bovenste X .. het maakt niets uit waar hij komt te staan als de straal altijd maar gelijk is (waardoor hij dus automatisch in een circel om het middel punt kan lopen)

Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Je wilt dus een willekeurig nog niet bezet coordinaat genereren waarvoor X'2 + Y'2 == r2 (met de (0,0) coordinaat in het middelpunt van de cirkel)?

SA --> P&W

edit:

Voor de duidelijkheid: ik zou het dus zo doen: r weet je. Pak een willkeurige niet bezette X' en bereken aan de hand daarvan de Y'.

[ Voor 29% gewijzigd door F_J_K op 07-03-2005 11:15 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
F_J_K schreef op maandag 07 maart 2005 @ 11:14:
Je wilt dus een willekeurig nog niet bezet coordinaat genereren waarvoor X'2 + Y'2 == r2 (met de (0,0) coordinaat in het middelpunt van de cirkel)?

SA --> P&W

edit:

Voor de duidelijkheid: ik zou het dus zo doen: r weet je. Pak een willkeurige niet bezette X' en bereken aan de hand daarvan de Y'.
Dat gaat jammer genoeg niet. Hier moet een wiskundige formule komen want x en y moeten beide op de rand van die circel komen die je met de passer zou kunnen maken door met een passer vanuit x en het middel punt een circel te maken...

ik zal nog eeen screen shot online zetten in men volgende post..

Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Verwijderd schreef op maandag 07 maart 2005 @ 11:22:
Dat gaat jammer genoeg niet. Hier moet een wiskundige formule komen want x en y moeten beide op de rand van die circel komen die je met de passer zou kunnen maken door met een passer vanuit x en het middel punt een circel te maken...
Ja precies:

Middelpunt ken je al. Formule levert een (x,y) op. Als (x,y) bezet is bereken je de r. Kies een willekeurige x' <= r die niet bezet is (of neem x' = x + kleine waarde). Bereken y' aan de hand van de bekende r en de gekozen x'.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eerst 2e sshot.

Afbeeldingslocatie: http://www.xs4all.nl/~hhouben/circel2.jpg

Als je nadenkt ik kan op de y as of x as dus wel een willekeurig punt pakken ten opzicht van het middel punt.. maar dan klopt het niet meer met de circel.. want als r = 30 (straal) en ik pak een willekeurige pixel Y .. middel punt is 300 .. willekeurig punt is 300 - 30.. dan kom ik altijd te ver van het middel punt af tenzij je precies op 30 graden zit.. Y moet afnemen en x moet toenemen .. of anders om.. maar niet 1 van de 2..

Beetje lastig te begrijpen... ( of ik begrijp het helemaal verkeerd:P)

maar een willekeurig punt pakken op de straal werkt niet..

edit..
waar oude punt staat is niet helemala waar.. mijn programma zet ze te ver naar buiten.. he toude punt ligt eigenlijk vlakbij het middel punt.. .. maar de hoek is wel goed...

[ Voor 13% gewijzigd door Verwijderd op 07-03-2005 11:33 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt een punt op een circel.

Die staat op een bepaalde hoek. Stel, 74 graden.
Met een bepaalde straal.
de X en Y coordinaten van het punt ten opzichte van het middenpunt zijn:
X = cos(hoek)*Straal
y= sin(hoek)*Straal

Als je de hoek nu weet (74 graden nu dus), en je wilt dat hij iets verder gaat, maak je er gewoon bijv 104 graden van. Dan bereken je weer op dezelfde manier de X en de Y. En dat moet dan het nieuwe punt zijn op de circel in X en Y coordinaten ten opzichte van het midden.

Of begrijp ik je nu niet goed?

Als je wilt dat ie een bepaald aantal pixels beweegt rond de circel ipv een bepaald aantal graden, dan moet je eerst de omtrek berekenen in pixels (2*PI*R) en dan deel je 360 door de omtrek in pixels om te weten hoeveel graden 1 pixel verschuiving is.

[ Voor 28% gewijzigd door Verwijderd op 07-03-2005 11:50 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Verwijderd schreef op maandag 07 maart 2005 @ 10:36:
Mijn probleem is dus eigenlijk. Ik zet een punt neer in een circel. Nu kan het voorkomen dat er 2 punten over elkaar heen komen. Dit mag niet gebeuren en daarvoor wil ik hem over diezelfde rand van de circel ergens anders plaatsen.
Kun je deze alinea nog eens 4 keer zo uitgebreid uitschrijven want ik snap er zo geen bal van :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Pano heeft het goed door. En nee hij hoeft niet over de lijn te bewegen. Hij moet gewoon over de zelfde lijn herplaatst worden 1 keer.

Ik zal eens proberen wat pano mij vertelt heeft.. dan kom ik zo bij jullie terug.. want ik heb al eens iets in die trend geprobeerd..

Brb

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Blijf erop letten dat je computer in radialen wil rekenen en niet in graden.
Dus elke hoek die je erin stopt moet in radialen zijn.
code:
1
radialen = graden * PI /180 ;

En elke waarde die je terug krijgt zijn dus radialen en moet je dus eventueel weer terugzetten naar graden.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok ook even die dingen omzetten naar radialen..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hier van forum
X = Cos(hoek) * Straal
Y = Sin(hoek) * Straal

Plus omzetten naar radialen

x = cos(50*pi/180) * straal
y= sin(50*pi/180) * straal


oude formule..
'X = 300 + (300 - Y * Math.Cos(45 * Pi / 180))
'Y = 300 - (300 - Y * Math.Sin(45 * Pi / 180))
dat omrekenen naar radialen had ik er dus onbewust al in zitten in men oude formule.. ok even aanpassen in men code..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hij knalt me nu alles links boven de hoek in..

X = Cos(50 * Pi / 180) * (300 - Y)
Y = Sin(50 * Pi / 180) * (300 - Y)

het staat wel op 50 graden van het middel punt (ofja 180 - 50) graden aangezien 180 graden het startpunt is..

ik zal er nog een sshot bij zetten .. duurt een minuutje.

EDIT!!!

Ok ik denk er nu pas aan.. ik heb ook nog niets terug om gerekent van radialen..

is dat dan x = x / pi / 180? ik denk dat ik daar nog wat uitleg bij nodig heb...

edit pic..
Afbeeldingslocatie: http://www.xs4all.nl/~hhouben/cirkel3.jpg

[ Voor 30% gewijzigd door Verwijderd op 07-03-2005 12:10 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Nofi, maar heb je uberhaupt een idee van de basale wiskunde die hier achter zit? :?

Een willekeurig punt op een cirkel bepaal je als volgt:
code:
1
2
X = sin(angle) * radius + offsetX;
Y = cos(angle) * radius + offsetY;

Dit is gewoon brugklaswiskunde hoor?

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

1 radiaal (de afstand op de omtrek van 180 graden) = 180 graden.

bij een straal van 1 is 1 radiaal gelijk aan 1 pi (3,nogwat)

bij een straal groter dan 1 is 1 radiaal gelijk aan: pi*straal

een hele circel is dus 2 radialen, is dus 2* pi*straal

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
curry684 schreef op maandag 07 maart 2005 @ 12:10:
Nofi, maar heb je uberhaupt een idee van de basale wiskunde die hier achter zit? :?

Een willekeurig punt op een cirkel bepaal je als volgt:
code:
1
2
X = sin(angle) * radius + offsetX;
Y = cos(angle) * radius + offsetY;

Dit is gewoon brugklaswiskunde hoor?
ja ik volg gewoon hbo wiskunde..

en ik heb ook geen idee waarom het mij niet wil lukken.. ik ben hier al dagen aan bezig
er is gewoon iets wat ik over het hoofd zie..

Acties:
  • 0 Henk 'm!

Verwijderd

Ik weet niet wat je nog meer met je "schietschijf" doet. Gezien het zoeken naar geschikte locaties kan je ook handig met pool-coordinaten werken. Een mogelijke botsing kan je controleren met het inproduct van de twee vectoren naar de middens van 2 circeltjes.
Pas in de teken-procedures ga je dan over naar een carthesisch stelsel.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn schietschijf is een een Sociogram.. hier worden leerlingen op geplaats. hoe verder van het midden van de cirkel hoe meer ze buiten de groep staan.. het is dus van belang dat iemand die even veel stemmen heeft gekregen dan iemand anders ook op precies dezelfde afstand an het middel punt staat.. maar ze mogen elkaar niet over lappen. daarom wil ik die nieuwe x en y punten berekenen..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bijvoorbeeld..

ik gebruik nu deze formule..

X = Sin(60 * Pi / 180) * (300 - Y) + X
Y = Cos(60 * Pi / 180) * (300 - Y) + Y

hij zet alles precies op 60 graden.. en alles staat zo ongeveer goed..

verander ik die graden naar 80 dan duwt hij alles meer naar buiten. dan staat hij dus niet precies op de goede afstand van het middel punt maar te ver.. zo gebeurt het ook met 45 graden enz. enz.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 07 maart 2005 @ 12:19:
Mijn schietschijf is een een Sociogram.. hier worden leerlingen op geplaats. hoe verder van het midden van de cirkel hoe meer ze buiten de groep staan.. het is dus van belang dat iemand die even veel stemmen heeft gekregen dan iemand anders ook op precies dezelfde afstand an het middel punt staat.. maar ze mogen elkaar niet over lappen. daarom wil ik die nieuwe x en y punten berekenen..
Poolcoordinaten :P .

Acties:
  • 0 Henk 'm!

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 24-08 23:48

MrSleeves

You'll thank me later.

Zoals bloog zegt: Overgaan op poolcoördinaten.
Dat is tenslotte relevante informatie (en met name de straal).
Een coördinaat zegt hier dus niks.
Verwijderd schreef op maandag 07 maart 2005 @ 12:28:
Bijvoorbeeld..

ik gebruik nu deze formule..

X = Sin(60 * Pi / 180) * (300 - Y) + X
Y = Cos(60 * Pi / 180) * (300 - Y) + Y

hij zet alles precies op 60 graden.. en alles staat zo ongeveer goed..

verander ik die graden naar 80 dan duwt hij alles meer naar buiten. dan staat hij dus niet precies op de goede afstand van het middel punt maar te ver.. zo gebeurt het ook met 45 graden enz. enz.
Die Y-en zijn niet allemaal dezelfde neem ik aan? Anders is het wel logisch dat het niet klopt.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja de y'en zijn het zelfde..

en dan ga ik maar eens die pool coördinaten onderzoeken...
en hoe kan ik daar dan het beste van gebruik maken?

[ Voor 83% gewijzigd door Verwijderd op 07-03-2005 12:40 ]


Acties:
  • 0 Henk 'm!

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 24-08 23:48

MrSleeves

You'll thank me later.

Verwijderd schreef op maandag 07 maart 2005 @ 12:37:
ja de y'en zijn het zelfde..

en dan ga ik maar eens die pool coördinaten onderzoeken...
Dan snap ik niet helemaal waarom die (300-Y) zo is en waarom X daar niks te zoeken heeft.

Poolcoördinaten zijn simpel: Je hebt een straal (r) en een hoek (phi). That's it.
Kijk anders ook even op www.wisfaq.nl

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja heb het al

http://www.luc.ac.be/scholennetwerk/Wisintro/7.pdf

300 - y de uitkomst daarvan is de straal...(in pixels)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:10

Janoz

Moderator Devschuur®

!litemod

Waarom laat je de straal dan van Y afhangen? Dan is het niet zo vreemd dat een andere lokatie (dus andere Y) een andere straal heeft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik laat de straal van y af hangen omdat als ik de afstand van de straal ga berekenen voor de kinderen ik altijd een vaste x waarde = 300 heb evenveel als het middel punt.. waardoor de afstand die y heeft van het middel punt altijd de straal is...

niet zo vreemd dus als ik dat meteen had uitgelegd.. niet aan gedacht.. sorry

[ Voor 15% gewijzigd door Verwijderd op 07-03-2005 12:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu pauze.. dus ik ben dalijk terug..

wat ik graag wou vragen als het niet te veel moeite is..

Middel punt is 300 , 300
Straal = 20
hoek is nog 0 graden.. (of 180 graden omdat hij links op de circel staat)

hoe bereken ik dat nu met die pool coordinaten als ik hem naar 30 graden wil zetten?

.. ik ben dus nu even we g voor pauze.. ik wou toch wel nog even iedereen hier bedanken voor hun aandacht.. ook al mag dat niet van de tweakers..:p

Acties:
  • 0 Henk 'm!

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 24-08 23:48

MrSleeves

You'll thank me later.

x- en y- coördinaten uitrekenen voor hoek. De straal is vervolgens de amplitude.
En daarna een verplaasting naar het middelpunt (dus bij x en y 300 optellen).

Als je overigens x vastzet op 300, en de straal moet gelijk zijn, dan zijn er max. 2 oplossingen voor de hoek.

Je moet de punten zien als vectoren vanuit het middelpunt. Het middelpunt stel je in op (0,0) en pas bij het tekenen verplaats je de handel.

[ Voor 48% gewijzigd door MrSleeves op 07-03-2005 13:08 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 07 maart 2005 @ 12:12:
bij een straal van 1 is 1 radiaal gelijk aan 1 pi (3,nogwat)

bij een straal groter dan 1 is 1 radiaal gelijk aan: pi*straal

een hele circel is dus 2 radialen, is dus 2* pi*straal
Eehm, een radiaal is een hoek eenheid, geen lengte eenheid. 1 Radiaal is dus, net als 1 graad, altijd hetzelfde, ongeacht de straal van de cirkel. Bij een straal van 1 is de omtrek van een cirkelboog van x radialen ook x lang. Het is me een raadsel waar je vandaan haalt dat 1 radiaal dan gelijk is aan 1 pi 8)7

[ Voor 18% gewijzigd door .oisyn op 07-03-2005 13:16 ]

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!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:10

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op maandag 07 maart 2005 @ 13:02:
ik heb nu pauze.. dus ik ben dalijk terug..

wat ik graag wou vragen als het niet te veel moeite is..

Middel punt is 300 , 300
Straal = 20
hoek is nog 0 graden.. (of 180 graden omdat hij links op de circel staat)

hoe bereken ik dat nu met die pool coordinaten als ik hem naar 30 graden wil zetten?
je hebt 3 gegevens, middelpunt, straal en hoek. En je vraagt je af hoe je de hoek veranderd? Heb je al wat gelezen over pool coordinaten? Je vult die nieuwe hoek toch gewoon in?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja ik was bezig met lezen van documentatie... ook in men wiskudne boek en online.. maar toen kwam de pauze.. en ik dacht ik vraag dat nog even snel dan heb ik een goed voorbeeld..

Maarjah pauze is voorbij..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
'code zoals in mijn project
       Xx = (300 - Y) * Cos(10)
        Yy = (300 - Y) * Sin(10)
        
        X = Xx + 300
        Y = Yy + 300


300 - y is de straal..
+ 300 omdat het middelpunt 300 , 300 (pixel is)
code:
1
2
3
4
'formule zoals ie gebruikt moet worden in andere projecten, r als in straal.

x = r * cos(hoek)
y = r * sin(hoek)


ok een edit
code:
1
2
'je pc moet het nog omzetten in radialen. dat is hoek * pi / 180
x = r * cos(hoek * pi/180)

niet zo lastig dus.

en het werkt...
Een cursus Goniometrie is niet overbodig vooor mij..
ik zal het antwoord ook even in mijn openings post zetten dat andere het snel gevonden hebben..

[ Voor 15% gewijzigd door Verwijderd op 07-03-2005 14:41 ]

Pagina: 1