Как найти точки на кривой и отобразить их? - PullRequest
0 голосов
/ 13 марта 2012

Итак, у меня есть этот код, который берет данные из массива и рисует кривую:

void drawDataLine(int row) {  
  beginShape();
  for (int col = 0; col < colCount; col++) {
    if (data.isValid(row, col)) {
      float value = data.getPoint(row, col);
      float x = map(years[col], yearMin, yearMax, plotX1, plotX2);
      float y = map(value, dataMin, dataMax, plotY2, plotY1); 
      //vertex(x,y) ;    
      curveVertex(x, y);
      // Double the curve points for the start and stop
      if ((col == 0) || (col == colCount-1)) {
        curveVertex(x, y);
      }
    }
  }
  endShape();
}

У меня есть другая функция, которая отображает значения данных, когда курсор находится в пределах 3 пикселей от точки:

  for (int col = 0; col < colCount; col++) {

  if (data.isValid(row, col)) { 
      float radVal = ratio[col];
      float value = data.getPoint(row, col); 
      float compareValue = compare.getPoint(row, col);
      float x = map(years[col], yearMin, yearMax, plotX1, plotX2); 
      float y = map(value, dataMin, dataMax, plotY2, plotY1);
      float ellipse1MapVal = map(value, ellipse1Min, ellipse1Max, 10, 80);
      float ellipse2MapVal = map(compareValue, ellipse1Min, ellipse1Max, 10, 80); 
      radVal = map(radVal, radMin, radMax, 1, 7); 

      if (dist(mouseX, mouseY, x, y) < 3) {
        if (drawCirclesPrimary || drawCirclesSecondary) { 
          noStroke();
          if (drawCirclesPrimary) {
            fill(0, 255, 0, 100);
            ellipse(x, y, ellipse1MapVal, ellipse1MapVal);
          }
          if (drawCirclesSecondary) {
            fill(255, 0, 0, 100);
            ellipse(x, y, ellipse2MapVal, ellipse2MapVal);
          }
          fill(0);
          stroke(0);
          pushMatrix();
          translate(x, y);
          rotate(radians(radSec));
          line(0, -ellipse1MapVal/2, 0, ellipse1MapVal/2);
          popMatrix();
          radSec += radVal;
          textSize(10);
          textAlign(CENTER);
          text(nf(value, 0, 2) + " (" + years[col] + ")"+nf(compareValue, 0, 2), x, y-8);
        }
        else
          text(nf(value, 0, 2) + " (" + years[col] + ")", x, y-8);
      }
      if ((mouseX < x+3)&&(mouseX > x-3))
      {
        stroke(150);
        strokeWeight(1);
        line(x, plotY1, x, plotY2);
      } } }} 

Теперь проблема в том, что curveVertex выполняет свою интерполяцию и создает хорошие кривые, но я не могу получить точки на этих кривых, кроме тех, которые у меня уже есть. Я хочу, чтобы курсор показывал значения по всем точкам на графике, а не по 10 точкам, которые у меня есть в массиве, очень похоже на графики в Google или Yahoo Finance. Я нуб, когда дело доходит до обработки, поэтому любая помощь с этим будет принята с благодарностью.

Привет

1 Ответ

0 голосов
/ 13 марта 2012

curveVertex использует сплайны Кэтмулла-Рома для расчета интерполяционной кривой между точками. libGDX имеет реализацию Catmull-Rom на Java.

См .: http://code.google.com/p/libgdx/

Конкретный исходный код, который вычисляет сплайн, находится здесь: http://code.google.com/p/libgdx/source/browse/trunk/gdx/src/com/badlogic/gdx/math/CatmullRomSpline.java

...