绘制斐波那契弧

Gab*_*iel 7 java math jfreechart fibonacci

我正在尝试创建一个类似于这些的Fibonacci Arcs应用程序. 股票图表斐波纳契弧

但是,我想要完整的圆圈而不是圆弧,我想绘制的图片超过图片中显示的三条斐波纳契线.我已经使用JFreeChart创建了一个应用程序来尝试完成此任务.但是,这是尝试绘制上一张图片中显示的相同弧(但作为圆圈)时的结果.我的应用放大了

最初,它只是看起来不对,但是当我缩小时,它确实是一个圆圈,但它太大了. 在此输入图像描述

要计算弧线,你绘制一条线,然后取一个斐波那契比例 - 让我们使用.381例如 - 该线的百分比.如果你看第一张照片,你会看到最里面的圆弧与直线相交,直线距离圆心的距离为.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);
Run Code Online (Sandbox Code Playgroud)

这是计算线距离的代码

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);

}
Run Code Online (Sandbox Code Playgroud)

我找回了一个圆形对象列表(这是我创建的一个包含半径和中心点的对象),每个圆圈需要绘制一个,然后绘制它们.

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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这个问题与时间的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);
Run Code Online (Sandbox Code Playgroud)

Gab*_*iel 0

我不确定正确的术语,所以让我们将代表(x,y)您在显示器上的位置的实际坐标称为“屏幕空间”,并将(x,y)图表的坐标称为“图表空间”。

我的问题是我将点从屏幕空间转换为图表空间,然后计算我的点。相反,我应该计算屏幕空间中的所有点,然后将每个计算出的点转换为图表空间。

i我要绘制的弧组数量在哪里?(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();
Run Code Online (Sandbox Code Playgroud)

这是计算圆上点的方法。其中,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我将所有这些点转换为图表空间,并将它们绘制在图表上。

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);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

需要注意的一点是,圆圈的半径取决于您显示的特定图表的大小。a在 1 年图表上从一点到另一点绘制的圆圈b将小于在 5 年图表上从这些相同点绘制的圆圈。