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:
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.
Alvast bedankt!
Groeten,
Emiel
Mate van curve lijn: punt bepalen.
Mate van curve lijn: punt bepalen.
Laatst gewijzigd door enijhuis op 13 jan 2015, 16:26, 1 keer totaal gewijzigd.
Re: Mate van curve lijn: punt bepalen.
Misschien een curve kiezen die bekend is en die vergroten/verkleinen? Anders, misschien de curve op deze grafiek.
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?
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)
(Raffiek Torreman)
Re: Mate van curve lijn: punt bepalen.
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?
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?
Re: Mate van curve lijn: punt bepalen.
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
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
Re: Mate van curve lijn: punt bepalen.
Dank je voor je duidelijke uitleg, Arie.
Ik ga het programmeren en laat het resultaat in deze post zien.
Emiel
Ik ga het programmeren en laat het resultaat in deze post zien.
Emiel
Re: Mate van curve lijn: punt bepalen.
Hoi Arie,
Jouw algoritme werkt perfect:
Zoals je in onderstaande code kunt zien had ik slechts het laatste gedeelte van je oplossing nodig :
Nogmaals dank,
Emiel
Jouw algoritme werkt perfect:
Zoals je in onderstaande code kunt zien had ik slechts het laatste gedeelte van je oplossing nodig :
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
Emiel
Re: Mate van curve lijn: punt bepalen.
Leuk om de resultaten te zien, bedankt.
Vooral die wereldkaart is nu om in te lijsten!
Vooral die wereldkaart is nu om in te lijsten!