2017-04-19 6 views
0

Lassen Sie sagen, ich 5 Punkte haben, wo p0 und p4 mit Werten fixiert sind 0.0 und 4.0: BewegenWie dehnt man Punkte?

0 | 1.0 | 2.0 | 3.0 | 4 

Die Punkte in der Mitte ändern können, aber sie müssen die anderen einmal strecken.

Also für eine stretch „nach rechts“, muss er die i.Vj. Werte um den sich bewegenden Punkt und press die nächsten sind zwischen dem sich bewegenden Punkt und dem letzten Punkt, halten die Proportionen zwischen den einzelnen Punkten enlarge.

Ich habe diese code schreiben, die die 3 ° Punkt 2.5 von seiner ursprünglichen 2.0 x-Position:

const int numPoints = 5; 
double points[numPoints] = { 0.0, 1.0, 2.0, 3.0, 4.0 }; 

int stretchedPoint = 2; 
double prevX = points[stretchedPoint]; 
points[stretchedPoint] = 2.5; 

std::cout<< points[0]; 
for (int prevPoint = 1; prevPoint < numPoints - 1; prevPoint++) { 
    // prev points 
    if (prevPoint < stretchedPoint) { 
     double ratio = points[stretchedPoint]/prevX; 
     points[prevPoint] *= ratio; 
    // next points 
    } else if (prevPoint > stretchedPoint) { 
     double ratio = (points[numPoints - 1] - prevX)/(points[numPoints - 1] - points[stretchedPoint]); 
     points[prevPoint] *= ratio; 
    } 

    std::cout << " | " << points[prevPoint]; 
} 
std::cout << " | " << points[numPoints - 1]; 

die richtige für i.Vj. Punkte zur Folge haben mir geben:

0 | 1.25 | 2.5 | 0.76 | 4 

aber wenn ich versuche, den „same-wrapped-math“ für die nächsten Punkte anzuwenden, erhalte ich eine nicht-proportionale Skalierung, die seltsamen Ergebnisse geben (4?)

Kann mir jemand helfen?

Antwort

1

vergessen Sie über Nicht-Null-Ausgangspunkt

points[prevPoint] = points[stretchedPoint] + ratio * (points[prevPoint] - prevX) 

Beachten Sie, dass gleiche Logik zu previos Punkte angewendet werden sollte, wenn Startwert ungleich Null

Im Allgemeinen ist eine lineare Interpolation für die anfängliche anzuwenden X0..X1 Intervall und letzte X0new..X1ne w Intervall, haben ein

(Xnew - X0new)/(X1new - X0new) = (X - X0)/(X1 - X0) 
so 
XNew = X0new + (X1new - X0new) * (X - X0)/(X1 - X0) 
+0

Uhm, wobei das Verhältnis verwenden Sie? 0,96 jetzt hier http://coliru.stacked-crooked.com/a/f5671e6fbfba8419 – markzzz

+0

Meine Schuld, benutzte ich Altwert für Stretch-Punkt. Bearbeitet – MBo

+0

3,25 ist sowieso falsch! Das Verhältnis wird nicht beibehalten. – markzzz

1

verwenden, was Sie auf der linken Seite des Punktes hat (und das ist dies kann in Betrieb) neu geschrieben werden, irgendwie wie:

// double ratio = (points[stretchedPoint] - 0)/(prevX - 0); 
// points[prevPoint] = 0 + ratio * (points[prevPoint] - 0); 

Um das zu erreichen genau die dualen auf der rechten Seite, soll es sein:

} else if (prevPoint > stretchedPoint) { 
    double ratio = (points[numPoints - 1] - points[stretchedPoint])/
     (points[numPoints - 1] - prevX); 
    points[prevPoint] = points[numPoints - 1] - 
     ratio * (points[numPoints-1] - points[prevPoint]); 
} 
+0

Ihr Algo scheint perfekt zu funktionieren. Wird die Formel "lineare Interpolation" von @MBo vorgeschlagen? p.s. 'Tippfehler Warnung an' Punkten [prevPoint]) – markzzz

+1

Nun, in der Tat, ja, es ist die richtige lineare Transformation. Auch nicht um mit einem Punkt auf der linken Seite statt mit Null zu beginnen, können Sie den kommentierten Code nehmen und '0' durch' points [0] 'ersetzen –

Verwandte Themen