Mate van curve lijn: punt bepalen.

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Plaats reactie
enijhuis
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 13 jan 2015, 14:46

Mate van curve lijn: punt bepalen.

Bericht door enijhuis » 13 jan 2015, 16:12

Hoi allemaal,

Voor een toepassing die zich richt op geo-mapping loop ik tegen een ogenschijnlijk eenvoudig wiskundige uitdaging aan waar ik niet uit kom. Het gaat om het volgende.
Een route op een kaart kan worden getoond als een lijn tussen twee punten (X1,Y1 en X2,Y2). Bij veel routes wordt dit als snel onoverzichtelijk. De overzichtelijkheid wordt verbeterd door de lijnen gebogen te tonen. De mate van buiging dient voor alle lijnen op de kaart gelijk te zijn ongeacht de lengte en richtingscoefficiënt.
Zie afbeelding:
Afbeelding
X1, Y1, X2 en Y2 zijn bekend. Wat ik zoek is het algoritme om het derde (rode) punt te berekenen.
De maximale afstand van de buiging bevindt zich altijd halverwege de lijn.
Tot slot: de mate van buiging wil ik als instelling beschikbaar maken als percentage; zie 1e plaatje:
lengte blauwe lijn / lengte zwarte lijn.

Het voorlopige resultaat na uren stoeien zie je hieronder:
Duidelijk is te zien dat bijvoorbeeld de mate van buiging m.b.t. de route Oslo - St Petersburg groter is als de rest.
Hulp is dus gewenst.
Afbeelding

Alvast bedankt!
Groeten,
Emiel
Laatst gewijzigd door enijhuis op 13 jan 2015, 16:26, 1 keer totaal gewijzigd.

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Mate van curve lijn: punt bepalen.

Bericht door David » 13 jan 2015, 16:26

Misschien een curve kiezen die bekend is en die vergroten/verkleinen? Anders, misschien de curve op deze grafiek.
Afbeelding
De grafiek (m.b.v. GeoGebra) zijn y = sqrt(sin(x)) en y = 0,9 geplot. Dan is het rode punt ongeveer op 0.08 keer de lengte van de lijn. Zoiets?
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

enijhuis
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 13 jan 2015, 14:46

Re: Mate van curve lijn: punt bepalen.

Bericht door enijhuis » 13 jan 2015, 17:47

Bedankt voor je reactie, David.
Ik weet niet of ik er iets mee kan.
Concreet voorbeeld:
X1 = 100
Y1 = 200
X2 = 250
Y2 = 50
Mate van buiging = 10% (lengte blauwe lijn = 10% van lengte lijn)
Wat zijn de coördinaten X3 en Y3 voor het rode punt?
En hoe kom ik tot die uitkomst?

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Mate van curve lijn: punt bepalen.

Bericht door arie » 13 jan 2015, 21:57

Je hebt een lijnstuk
van P1 = (x1, y1)
naar P2 = (x2, y2).

Noem het midden van dit lijnstuk M = (xm, ym), dan is
xm = (x1 + x2) / 2
ym = (y1 + y2) / 2

Definieer de vector v van P1 naar P2 als
v = [x2 - x1, y2 - y1]

Een vector u die loodrecht staat op v, en even lang is als v, is dan
u = [ -(y2 - y1), x2 - x1] = [y1 - y2, x2 - x1].

Noem f = lengte blauwe lijnstuk / lengte zwarte lijnstuk,
dan vind je het rode punt R = (xr, yr) door f * u bij M op te tellen:

xr = (x1 + x2) / 2 + f * (y1 - y2)

yr = (y1 + y2) / 2 + f * (x2 - x1)

Neem je f positief, dan ligt punt R links van je als je van P1 naar P2 gaat,
Neem je f negatief, dan ligt punt R rechts van je als je van P1 naar P2 gaat.


Voorbeeld:

P1 = (100, 200)
P2 = (250, 50)
f = 10% = 0.1

xr = (100 + 250) / 2 + 0.1 * (200 - 50) = 175 + 15 = 190

yr = (200 + 50) / 2 + 0.1 * (250 - 100) = 125 + 15 = 140

enijhuis
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 13 jan 2015, 14:46

Re: Mate van curve lijn: punt bepalen.

Bericht door enijhuis » 13 jan 2015, 23:09

Dank je voor je duidelijke uitleg, Arie.
Ik ga het programmeren en laat het resultaat in deze post zien.

Emiel

enijhuis
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 13 jan 2015, 14:46

Re: Mate van curve lijn: punt bepalen.

Bericht door enijhuis » 14 jan 2015, 14:13

Hoi Arie,

Jouw algoritme werkt perfect:
Afbeelding
Afbeelding

Zoals je in onderstaande code kunt zien had ik slechts het laatste gedeelte van je oplossing nodig :D :

Code: Selecteer alles

' Create the route to be displayed
Private Sub GenerateCurve(sngarrDataPoints() As Single, sName As String, oRoute As clsRoute)

    Dim sngarrCurvePoints() As Single
    Dim sngarrDataPointsParabola(1 To 3, 1 To 2) As Single
    Dim oShape As Shape
    Dim sngX1 As Single
    Dim sngY1 As Single
    Dim sngX2 As Single
    Dim sngY2 As Single
    Dim sngXR As Single
    Dim sngYR As Single
    
    ' Show route as a (curved) line?
    If goUser.Setting(RouteShapeAsLine) Then
    
        'sngXR: het rode punt R = (xr, yr)
        sngX1 = sngarrDataPoints(1, 1)
        sngY1 = sngarrDataPoints(1, 2)
        sngX2 = sngarrDataPoints(UBound(sngarrDataPoints, 1), 1)
        sngY2 = sngarrDataPoints(UBound(sngarrDataPoints, 1), 2)

        sngXR = (sngX1 + sngX2) / 2 + 0.06 * (sngY1 - sngY2)
        sngYR = (sngY1 + sngY2) / 2 + 0.06 * (sngX2 - sngX1)
    
        sngarrDataPointsParabola(1, 1) = sngX1
        sngarrDataPointsParabola(1, 2) = sngY1
        sngarrDataPointsParabola(2, 1) = sngXR
        sngarrDataPointsParabola(2, 2) = sngYR
        sngarrDataPointsParabola(3, 1) = sngX2
        sngarrDataPointsParabola(3, 2) = sngY2
    
        sngarrDataPoints = sngarrDataPointsParabola

    End If
    
    'Draw the freeform based on the curve points array that will define the shape
    sngarrCurvePoints = GetArrayOfCurvePoints(sngarrDataPoints)
    Set oShape = AddCurve(sngarrCurvePoints, PREFIX_ROUTE & sName, oRoute)

    'Do some formatting to the shape
    Call goFormat.AlterRouteShape(oShape, oRoute)
    
    'Add to shapes collection
    Call oRoute.ShapeObjects.Add(Item:=oShape, Key:=sName)

    'CleanUp
    Erase sngarrDataPoints
    Erase sngarrCurvePoints
    Erase sngarrDataPointsParabola
    
End Sub    
Nogmaals dank,
Emiel

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Mate van curve lijn: punt bepalen.

Bericht door arie » 15 jan 2015, 16:41

Leuk om de resultaten te zien, bedankt.
Vooral die wereldkaart is nu om in te lijsten!

Plaats reactie