2017-04-26 75 views
7

我正在嘗試創建一個繪製類似於這些的斐波納契弧的應用程序。 Stock Chart Fibonacci ArcsDraw Fibonacci Arcs

但是,我想要完整的圓圈而不是圓弧,並且我想繪製超過圖片中顯示的三條斐波那契線。我已經使用JFreeChart創建了一個應用程序來嘗試完成此操作。但是,這是試圖繪製上一張圖片中顯示的相同弧(但圓圈)時的結果。 My app zoomed in

最初,它看起來錯了,但是當我縮小時,它確實是一個圓圈,但它太大了。 enter image description here

要計算弧線,可以繪製一條線,然後取一個斐波那契數 - 例如,使用.381 - 該線的百分比。如果你看第一張圖片,你會看到最裏面的圓弧與直線距離圓心的距離的0.381%相交。首先我計算這一點。然後我構建了一條從.381%點到中心的線。然後我把這條線的距離,這應該是半徑。然後我用這個半徑繪製圓圈。

下面是計算半徑的代碼。停止和開始的地方是繪製線的停止點和起始點。

multiplier = ratio38Value + i; 
diffx = (stop.getX() - start.getX()) * multiplier; 
diffy = (stop.getY() - start.getY()) * multiplier; 
xValue = start.getX() + diffx; 
yValue = start.getY() + diffy; 
point = new Point(xValue, yValue); 
lineSegment = new Line(point, stop); 
radius = lineSegment.getDistance(); 
circle = new Circle(stop.getX(), stop.getY(), radius); 
circles.add(circle); 

這裏是計算的線

public double getDistance(){ 
    double x = Math.pow(endPoint.getX() - startPoint.getX(), 2); 
    double y = Math.pow(endPoint.getY() - startPoint.getY(), 2); 
    return Math.sqrt(x + y); 

} 

的我回來圓對象(這是一個對象我創建保持所述半徑和中心點)爲一個列表中的一個的距離的代碼每個需要繪製的圓圈然後繪製它們。

List<Circle> circles = fibonacciCalculations.getFibonacciArcs(startPoint, endPoint); 
if(circles != null) 
{ 
    for (Circle circle : circles){ 
     double xCenter = circle.getX(); 
     double yCenter = circle.getY(); 
     double radius = circle.getRadius(); 
     plot.addAnnotation(new XYShapeAnnotation(new Ellipse2D.Double(xCenter - radius, yCenter - radius, radius + radius, radius + radius))); 
    } 
} 

我認爲這個問題與時間的x軸和價格的y軸如何不完全相關。我的意思是,如果半徑是20,那麼每個點你都會離開中心20個單位。所以說你的股票價格只有5美元,在你的最低點你會在-15。如果是這樣,我不知道如何解決它。但在我的邏輯中也可能有一些錯誤。任何想法,將不勝感激。

編輯:雖然酒吧看起來像他們可能是第一張圖片每週酒吧,他們確實是每天酒吧。另外,我已經將座標從數據空間轉換爲xy座標。我使用下面的代碼來做到這一點。

@Override 
public void chartMouseMoved(ChartMouseEvent event) { 
    Rectangle2D dataArea = cp.getScreenDataArea(); 
    JFreeChart chart = event.getChart(); 
    XYPlot plot = (XYPlot) chart.getPlot(); 
    ValueAxis xAxis = plot.getDomainAxis(); 
    ValueAxis yAxis = plot.getRangeAxis(); 
    double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, 
      RectangleEdge.BOTTOM); 
    double y = yAxis.java2DToValue(event.getTrigger().getY(), dataArea, 
      RectangleEdge.LEFT); 
+0

是的,規模是拋出的形象,所以很難知道發生了什麼事情。你可以做的是將自己的比例縮放到與第一張圖像相同的比例。對於x軸,比例單位是幾周。在Count中,在圓心和交點之間有多少個單位,然後使用計算出的比例來調整您的比例。兩個圖表上的單位應該匹配。對y軸做同樣的事情。 –

+0

@NickZiebert是正確的:['XYShapeAnnotation'](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/annotations/XYLineAnnotation.html)座標位於「數據空間」中[示例](http://stackoverflow.com/a/6802375/230513)。 – trashgod

+1

我想幫助您調試,但您不提供足夠的信息 - 否則它只會花費太多時間。猜測:不正確的比例,你的線只是更長的時間,然後你認爲,混合開始/停止,空間轉換。你能提供一個完整的代碼示例 - 也許在github上?或者你能提供一些真實的數字嗎? –

回答

0

我不知道正確的術語,所以讓我們稱之爲實際(x,y)座標,代表你是你的顯示器「屏幕空間」在哪裏,讓我們調用圖「的圖空間」的(x,y)座標。

我的問題是我將屏幕空間的點轉換爲圖表空間,然後計算我的點數。相反,我應該在屏幕空間計算所有點數,然後將每個計算點轉換爲圖表空間。

其中i是我想繪製的圓弧組的數量。 (我= 0,然後我爲38,50,62比率繪製圓圈,i = 1然後我繪製-1.68,-1.50 ... 1.50,1.68比率的圓圈)我使用此代碼獲取我的點是中心和起點之間給定的比例。

  multiplier = ratio62Value + i; 
      diffx = (stop.getX() - start.getX()) * multiplier; 
      diffy = (stop.getY() - start.getY()) * multiplier; 
      xValue = start.getX() + diffx; 
      yValue = start.getY() + diffy; 
      point = new Point(xValue, yValue); 
      line = new Line(point, stop); 
      line.calculateCirclePoints(); 

這裏是計算圓上點的方法。其中,endPoint是中心點,半徑是從起點到終點的距離。

public void calculateCirclePoints(){ 
    double radius = getDistance(); 
    double radians; 
    double x; 
    double y; 
    Point currentPoint; 

    for (int degrees = 0; degrees <= 360; degrees += 1){ 
     radians = Math.toRadians(degrees); 
     x = endPoint.getX() + (radius * Math.cos(radians)); 
     y = endPoint.getY() + (radius * Math.sin(radians)); 
     currentPoint = new Point(x, y); 
     points.add(currentPoint); 
    } 
} 

最後,我將所有這些點轉換爲圖表空間,並在圖表上繪製它們。

public static Point converPointTo2D(Point point, Rectangle2D dataArea, XYPlot plot){ 
    double x; 
    double y; 

    CustomNumberAxis xAxis = (CustomNumberAxis) plot.getDomainAxis(); 
    CustomNumberAxis yAxis = (CustomNumberAxis) plot.getRangeAxis(); 

    x = xAxis.java2DToValue(point.getX(), dataArea, 
      RectangleEdge.BOTTOM); 
    y = yAxis.java2DToValue(point.getY(), dataArea, 
      RectangleEdge.RIGHT); 

    return new Point(x, y); 
} 

enter image description here

要注意的一點,圓的半徑是依賴於你是如何具體的圖表顯示得多。在1年的圖表上繪製的一個從ab的圓圈將比從5年的圖表中繪製的圓圈更小。