Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Midden Circel vinden (VB 6)

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

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
Hallo,

Ik zoek een methode om het midden van een circel te vinden. Deze circel kan op welke plek dan ook in een picturebox staan, zelf weet ik 1 coordinaat in de circel, voorderest weet ik niet of dat nou bovenin de circel is, aan de rand, of in het midden. Alleen dat deze coordinaat zich in de circel bevind.

Ook weet ik niet hoe groot de circel is.

Voorbeeld circel, ik weet dus in het geval van dit voorbeeld alleen de coordinaten van de gele stip in de circel.

Afbeeldingslocatie: http://img139.imageshack.us/img139/5903/naamlooszb4.jpg

Is het mogelijk om aan de hand van deze coordinaat het midden van een circel te vinden, door andere pixelpunten er naast uit te lezen?

De kleur van de circel is wit, de rest kan een andere kleur hebben, dus zelf zat ik te denken om constant dit te doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim bottom As Integer, left As Integer, top As Integer, right As Integer
Dim go As Boolean
dim top as integer

go = True

Do

    pos = main.pic.Point(x, y + jump)
    red = pos Mod 256
    If red > floorColor Then
        y = y + jump
        top = y
    Else:
    go = False
    
    End If
Loop While go = True


Maar als ik dan bijvoorbeeld helemaal rechts in de circel zit en daar omhoog ga, dan is het mogelijk dat dat niet de top is, maar dat ik al wel buiten de circel ben.

Zelf dacht ik dat als ik op een bepaalde manier, het meest top, left, bottom en right punt kon vinden dat ik dmv waar de coordinaten elkaar kruisen het middenpunt kon vinden.

Mischien is de denkwijze in de buurt, maar ik kom er zo niet uit.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 20-11 13:15

killercow

eth0

je kunt vrij simpel de maximale afstand zoeken door de breedste horizontale lijn te zoeken, dan die afstand door 2, en je hebt het midden.

Hoe je dit in vb doet, geen clue.

openkat.nl al gezien?


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
Ja, zoiets had ik ook al in gedachten, maar zelf heb ik ook geen idee hoe ik dat precies moet doen.

Weet je wel hoe het in 'psuedo' code zou moeten? Dan kan ik daarvanuit vast wel verder werken.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ga vanaf je punt naar links.... zodra je in een andere kleur komt zet je een teller en ga je naar rechts tot je daar in een andere kleur komt...
dan heb je de lengte van een zijde van je vierkant IN de cirkel... vanaf daar lijkt het me vrij eenvoudig :)

[pseudo]
zet teller
ga naar links tot andere kleur
onthou teller en zet nieuwe teller
ga naar rechts tot andere kleur
onthou teller en ga 1 omhoog
als 1 omhoog is andere kleur: je zit bovenin de cirkel
als 1 omhoog is zelfde kleur: je zit onderin de cirkel
combineer alle gegevens die je hebt tot coordinaat
[/pseudo]

[ Voor 41% gewijzigd door P.O. Box op 16-01-2008 16:47 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

ZpAz schreef op woensdag 16 januari 2008 @ 16:30:
Zelf dacht ik dat als ik op een bepaalde manier, het meest top, left, bottom en right punt kon vinden dat ik dmv waar de coordinaten elkaar kruisen het middenpunt kon vinden.

Mischien is de denkwijze in de buurt, maar ik kom er zo niet uit.
Dat lijkt me wel het handigst. Kwa kruising hoef je niet zo moeilijk te denken, die 4 coordinaten vormen een vierkant, het midden van het vierkant is het midden van de cirkel. Dus (right-left)/2 en (bottom-top)/2

Het meest linker punt vind je bijvoorbeeld door vanaf een willekeurig punt zo ver mogelijk naar links te gaan, en vandaaruit naar onder en naar boven, waarbij je steeds probeert of je op de volgende regel verder naar links kunt. Als dat kan dan weet je dat de andere richting de verkeerde kant op is (bijvoorbeeld als je bij het naar boven gaan iets verder naar links kunt, dan heeft het geen zin om naar onderen te gaan want dan zit je al onder het midden), en als je niet meer verder naar boven/naar onderen kan dan weet je dat de cirkel in die richting weer kleiner wordt. Als je in beide gevallen niet meer verder kunt heb je het meest linker coordinaat gevonden.

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.


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
Edwardvb schreef op woensdag 16 januari 2008 @ 16:44:
ga vanaf je punt naar links.... zodra je in een andere kleur komt zet je een teller en ga je naar rechts tot je daar in een andere kleur komt...
dan heb je de lengte van een zijde van je vierkant IN de cirkel... vanaf daar lijkt het me vrij eenvoudig :)

[pseudo]
zet teller
ga naar links tot andere kleur
onthou teller en zet nieuwe teller
ga naar rechts tot andere kleur
onthou teller en ga 1 omhoog
als 1 omhoog is andere kleur: je zit bovenin de cirkel
als 1 omhoog is zelfde kleur: je zit onderin de cirkel
combineer alle gegevens die je hebt tot coordinaat
[/pseudo]
Dan komt het nog niet uit, want als ik nu jou code vanuit de gele stip redeneer, dan kan ik nog met geen mogelijkheid het middenpunt vinden, de informatie die ik dan heb is dit:

Afbeeldingslocatie: http://www.wingsofadove.nl/pic.jpg

En met die coordinaten kan ik niet het midden vinden volgens mij.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
met mijn informatie heb je alleen de horizontale lijn hoor...

en euh.... bedenk eens goed wat de eigenschappen van een vierkant zijn...


oh edit: het hoeft natuurlijk geen vierkant te zijn... foutje van mijn kant... zie hieronder voor de rest :)... pseudo kode komt dan een regeltje bij :)

[ Voor 36% gewijzigd door P.O. Box op 16-01-2008 17:00 ]


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20-11 13:38

sopsop

[v] [;,,;] [v]

jawel hoor, de verticale streep moet je alleen niet vanuit de gele punt doen, maar vanuit de snijpunten van de horizontale streep met de circel. inprincipe hoef je daar maar 1 lijn te trekken, de andere lijn kun je berekenen. Het middelpunt van het circel is dan het middelpunt van het vierkant.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
sopsop schreef op woensdag 16 januari 2008 @ 16:57:
jawel hoor, de verticale streep moet je alleen niet vanuit de gele punt doen, maar vanuit de snijpunten van de horizontale streep met de circel. inprincipe hoef je daar maar 1 lijn te trekken, de andere lijn kun je berekenen. Het middelpunt van het circel is dan het middelpunt van het vierkant.
Ik begrijp niet helemaal wat je bedoelt, zou je het wat nader kunnen uitleggen?

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ZpAz schreef op woensdag 16 januari 2008 @ 16:55:
[...]


Dan komt het nog niet uit, want als ik nu jou code vanuit de gele stip redeneer, dan kan ik nog met geen mogelijkheid het middenpunt vinden, de informatie die ik dan heb is dit:

[afbeelding]

En met die coordinaten kan ik niet het midden vinden volgens mij.
Als je dat doet kun je de y coordinaat op de helft van het verticale lijnstuk nemen en de x coordinaat op de helft van het horizontale stuk.

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


  • Joshua
  • Registratie: Juli 2005
  • Laatst online: 12-11 13:44
Trek een horizontale lijn vanaf de gele punt, neem het midden van die horizontale punt.
Vanaf dat punt trek je een lijn verticaal, neem daar het middenpunt van en je hebt het middenpunt van je cirkel..

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
Bedankt, ik denk dat ik er nu wel uitkom :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je gaat overigens wel de mist in als de cirkel 'half' buiten beeld valt; dan klopt het midden niet (meer).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • WormLord
  • Registratie: September 2003
  • Laatst online: 06-10 21:15

WormLord

Devver

En nog een heel andere hint, als je 3 punten op de omtrek van een cirkel weet, dan kun je daarmee alles van die cirkel uitrekenen. Dus ook het midden.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
RobIII schreef op woensdag 16 januari 2008 @ 17:35:
Je gaat overigens wel de mist in als de cirkel 'half' buiten beeld valt; dan klopt het midden niet (meer).
Ja, dat is waar.. maar ik zie wel of dat voor problemen gaat zorgen. :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
WormLord schreef op woensdag 16 januari 2008 @ 17:49:
En nog een heel andere hint, als je 3 punten op de omtrek van een cirkel weet, dan kun je daarmee alles van die cirkel uitrekenen. Dus ook het midden.
Klopt.

Afbeeldingslocatie: http://tweakers.net/ext/f/8q9h4HSnV9Ack02mCu480SlJ/full.gif
[list=1]
• Je kijkt vanuit je random punt P (gele stip) hoe ver je naar links/rechts kunt; dat geeft "een" breedte (niet dé breedte)
• Daarna kijk je vanuit P hoe ver je naar boven/beneden kunt; dat geeft "een" hoogte (niet dé hoogte)
• Daarna deel je de breedte door 2, de hoogte door 2 je hebt je middelpunt. Voila.

Zoals je hierboven zult zien ligt het middelpunt (groene stip) precies op de helft van beide (zwarte) lijnen. Waarom dan moeilijk doen met de volledige hoogte/breedte te vinden?

Iets heel anders; VB6 werkt met twips (by default althans); als je pixels gaat uitlezen is het dus verstandig om dat in 'stappen' van screen.TwipsPerPixelX en screen.TwipsPerPixelY te doen; Die waardes zijn standaard geloof ik 15 en dat scheelt dus nogal wat 'metingen' (een factor 15 om precies te zijn :P ). Je zou ook nog verder kunnen optimaliseren maar dat laat ik even rechts liggen ;)

[ Voor 41% gewijzigd door RobIII op 16-01-2008 18:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

RobIII schreef op woensdag 16 januari 2008 @ 17:57:
Zoals je hierboven zult zien ligt het middelpunt (groene stip) precies op de helft van beide (zwarte) lijnen. Waarom dan moeilijk doen met de volledige hoogte/breedte te vinden?
Heel goed, dat is precies wat rwb en Spike1506 al zeiden, en bovendien niet wat WormLord zegt ;). De tip van WormLord is hier wat onhandig omdat de punten die je vindt niet exact op de rand van de cirkel liggen (het is slechts een benadering). Bij het bepalen van het midden van horizontale en verticale lijnen speelt deze inaccuraatheid veel minder omdat de cirkel in die richtingen wel enigszins symmetrisch is met een afwijking van maximaal 1 pixel.

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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op woensdag 16 januari 2008 @ 18:21:
[...]

Heel goed, dat is precies wat rwb en Spike1506 al zeiden, en bovendien niet wat WormLord zegt ;).
offtopic:
Ik was mijn animated gif nog aan 't maken :P :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RobIII schreef op woensdag 16 januari 2008 @ 18:36:
[...]

offtopic:
Ik was mijn animated gif nog aan 't maken :P :+
offtopic:
Die annimatie voegt ook echt wat toe boven alleen het laatste plaatje :+

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


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
ZpAz schreef op woensdag 16 januari 2008 @ 16:55:
[...]


Dan komt het nog niet uit, want als ik nu jou code vanuit de gele stip redeneer, dan kan ik nog met geen mogelijkheid het middenpunt vinden, de informatie die ik dan heb is dit:

[afbeelding]

En met die coordinaten kan ik niet het midden vinden volgens mij.
Je hebt dan 4 punten op de cirkel, terwijl je met 3 punten al voldoende info hebt om middelpunt en straal uit te rekenen.
Pagina: 1