[Wiskunde] Raakt dit punt de lijn?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste Tweakers,

Ik heb in .NET een programma gemaakt waar mensen met drag en drop bron items naar doelitems kunnen slepen. Na het verslepen wordt er een lijntje getrokken tussen de bron en de doel.

Van de lijn weet ik zijn startpunt (x, y) en zijn eindpunt (x,y). De lijn wordt dan mooi door de DrawLine functie geplaatst op de afbeelding.

Nu moet er alleen iets gebeuren als iemand op zo'n lijntje klikt. Ik gebruik daarvoor de OnMouseClick van het image control en heb dan de coordinaten (x,y) van de muis toen deze klikte. Ik moet nu alleen weten of de positie van de muis op deze lijn valt.

Ik weet alleen de start en eind coordinaten van de lijn en de x en y positie van waar mijn muis heeft geklikt maar heb geen idee hoe ik alle tussenliggende pixelpunten kan berekenen of met welke wiskundige formule ik dat zou moeten doen.

Iemand die mij op de juiste weg kan helpen of mij kan vertellen waar ik naar moet zoeken?

Alvast weer bedankt!

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Een rechte lijn kan je beschrijven volgens een formule f(x) = ax + b. Twee onbekenden (a en b) en twee vergelijkingen, namelijk voor punt (x1,y1) en (x2,y2). Stelsel is dus oplosbaar (invullen in elkaar en klaar) :)

/edit wat je in je titel zegt (raken) is toch eigenlijk wiskundig gezien wel wat anders dan "op de lijn klikken". Ik denk dat je dat laatste bedoelt :)
Je zit met usability natuurlijk wel een beetje moeilijk te doen, aangezien je exact op de lijn moet klikken. Je kan beter ook een tolerantie in bouwen, zodat de lijn makkelijker aan te klikken is.

[ Voor 45% gewijzigd door mithras op 25-09-2009 10:19 ]


Acties:
  • 0 Henk 'm!

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 15-09 18:04

TrailBlazer

Karnemelk FTW

je moet gewoon even de formule van die lijn bepalen dat moet je wel gehad hebben met wiskunde op school.

Je hebt de formule Y=aX+b
a=(x2-x1)/(y2-y1)
b=y1-a*x1

vervolgens vul je de X van je muiscoordinaten in de formule in en als de Y die hier uitrolt overeenkomt met de Y coordinaten van je muis raakt die hem.

Het is inderdaad wel zo makkelijk om inderdaad een marge er in te houden zodat je er 5 % naast mag zitten met klikken.

[ Voor 16% gewijzigd door TrailBlazer op 25-09-2009 10:23 ]


Acties:
  • 0 Henk 'm!

  • Canaria
  • Registratie: Oktober 2001
  • Niet online

Canaria

4313-3581-4704

mithras schreef op vrijdag 25 september 2009 @ 10:17:
Een rechte lijn kan je beschrijven volgens een formule f(x) = ax + b. Twee onbekenden (a en b) en twee vergelijkingen, namelijk voor punt (x1,y1) en (x2,y2). Stelsel is dus oplosbaar (invullen in elkaar en klaar) :)

/edit wat je in je titel zegt (raken) is toch eigenlijk wiskundig gezien wel wat anders dan "op de lijn klikken". Ik denk dat je dat laatste bedoelt :)
Je zit met usability natuurlijk wel een beetje moeilijk te doen, aangezien je exact op de lijn moet klikken. Je kan beter ook een tolerantie in bouwen, zodat de lijn makkelijker aan te klikken is.
Dat klinkt heel simpel, maar je moet wel een marge aanhouden. Exact op een lijn van 1 pixel klikken is bijzonder lastig :) Verder, een lijn die schuin loopt, verspringt. Een eerstegraadsformule kan namelijk halve getallen opleveren, die wel naar hele pixels worden gemapt.

Apparticle SharePoint | Apps | Articles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Super!, bedankt!! Ik ga meteen kijken of ik daar die tolerantie inderdaad ook in kan verwerken.

Acties:
  • 0 Henk 'm!

  • WVL_KsZeN
  • Registratie: Oktober 2002
  • Laatst online: 14:21
Vergeet ook niet om te controleren of het punt waarop je klikt wel binnen je lijnstuk ligt. Als je gewoon die formule probeert te gebruiken, dan kun je ook klikken waar je lijn al is opgehouden.

Makkelijkste is een check op óf x óf y..

/me heeft eindelijk ook een icoontje.. woef.. boeien..


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 14:46
Je weet de coördinaten van de plek waar je klikt, als je nou vervolgens gaat kijken wat de kleurwaarde is van die pixel, kan je in ieder geval zien of je op "een" lijn klikt, of op de achtergrond. Zou je bij meerdere lijnen ook met verschillende kleuren gaan werken, kan je op deze manier ook achterhalen op welke lijn er is geklikt.

Misschien een oplossing?

Acties:
  • 0 Henk 'm!

  • MrJay
  • Registratie: Juni 2004
  • Laatst online: 24-10-2024
Zoek even op "minimum distance point and line" en je zult formules vinden om de afstand te vinden tussen een punt en een recht. Als je nu een marge bepaalt op deze afstand (de dikte van de lijn als het ware) kan je toch met een zeker marge bepalen of de gebruiker op de lijn heeft geklikt of niet.

Maar opgelet! Zorg er wel voor dat de je ook controleert of er op het lijnstuk is geklikt, en niet op de recht die op dit lijnstuk ligt.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Doe gewoon een simpele punt - lijn afstands berekening en kijk of de afstand kleiner is dan bijvoorbeeld 10 (pixels). Dan weet je of de gebruiker in de buurt van de lijn klikte.

Acties:
  • 0 Henk 'm!

  • BurningSheep
  • Registratie: Januari 2000
  • Laatst online: 17-12-2024
Een andere reden om de afstand te berekenen is dat je waarschijnlijk een lijst met lijnsegmenten hebt die je wilt checken. Het lijnsegment met de kortste afstand is degene die je wilt hebben (tenzij de kortste afstand groter is dan een bepaalde drempelwaarde).

[ Voor 4% gewijzigd door BurningSheep op 25-09-2009 10:41 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zeg, jij deed toch niets met wiskunde? ;)
HuHu schreef op vrijdag 25 september 2009 @ 10:28:
Doe gewoon een simpele punt - lijn afstands berekening en kijk of de afstand kleiner is dan bijvoorbeeld 10 (pixels). Dan weet je of de gebruiker in de buurt van de lijn klikte.
Een andere oplossing is een ray-cirkel intersectie. De muisklik is een cirkel, de lijn is de ray. De lijn volgt eigenlijk de punten s + (e-s)∙t, met s en e de start- en eindpunten, en t alle waarden tussen 0 en 1. Feitelijk wil je weten wanneer de ray de cirkel raakt, dus wanneer hij van een bepaalde afstand van de cirkel ligt. oftewel |(s + (e-s)∙t) - c| = r, met c het middelpunt van de cirkel en r de radius. Dat is een tweedegraadsvergelijking die je kunt oplossen met de bekende ABC-formule. Als er geen oplossing is, of de mogelijke oplossingen liggen niet tussen 0 en 1, dan heb je mis geklikt :)

[ Voor 97% gewijzigd door .oisyn op 25-09-2009 10:55 ]

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!

Verwijderd

Topicstarter
Ik heb nog een mooie gevonden..., lang leve C# dan maar...

Er is in System.Drawing.Drawing2D een GraphicsPath object. Daar kan je met .AddLine de lijn aan toevoegen. Met IsOutlineVisible krijg je vervolgens een boolean retour of je point (muiscoordinaat) daar op valt. Je kan ook een pen met een pendikte meegeven die je dan mooi als marge kan misbruiken.

Ik kan dus C# weer fijn de wiskunde laten doen en enkele maanden later ook zelf mijn code nog begrijpen :-)

Wel zeer bedankt voor alle informatie!
Pagina: 1