绘制斐波那契弧线
Draw Fibonacci Arcs
我正在尝试创建一个应用程序来绘制类似于这些的斐波那契弧线。
但是,我想要完整的圆圈而不是圆弧,而且我想画的不仅仅是图中所示的三个斐波那契线。我已经使用 JFreeChart 创建了一个应用程序来尝试完成此操作。但是,这是尝试绘制上一张图片中所示的相同弧线(但作为圆圈)时的结果。
一开始只是觉得不对,但缩小后确实是一个圆圈,只是太大了。
要计算弧线,请画一条线,然后采用斐波那契比率 - 例如,我们使用 .381 - 该线的百分比。如果您查看第一张图片,您会看到最里面的圆弧与直线相交于直线与圆心距离的 0.381% 处。首先我计算这个点。然后我构建了一条从 .381% 点到中心的线。然后我取这条线的距离,应该是半径。然后我用这个半径画圆。
这是计算半径的代码。其中 stop 和 start 是画线的停止点和起点。
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。如果是这样,我不知道如何解决。但这也可能是我逻辑上的一些错误。任何想法,将不胜感激。
编辑:虽然在第一张图片中条形图看起来像是每周条形图,但它们确实是每日条形图。此外,我已经将坐标从数据 space 转换为 x y 坐标。我使用下面的代码来做到这一点。
@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);
我不确定正确的术语,所以让我们调用代表您在显示器上的位置的实际 (x,y)
坐标 "screen space" 让我们调用 (x,y)
坐标图表 "chart space"。
我的问题是我将点从屏幕 space 转换为图表 space,然后计算我的点。相反,我应该计算屏幕上的所有点 space,然后将每个计算出的点转换为图表 space。
其中 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();
这是计算圆上点的方法。其中,endPoint为圆心,radius为起点到终点的距离。
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);
}
}
最后,我将所有这些点都转换为图表 space,并在图表上绘制它们。
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);
}
需要注意一点,圆圈的半径取决于您显示的特定图表的大小。在 1 年图表上从点 a
到点 b
绘制的圆将小于在 5 年图表上从相同点绘制的圆。
我正在尝试创建一个应用程序来绘制类似于这些的斐波那契弧线。
但是,我想要完整的圆圈而不是圆弧,而且我想画的不仅仅是图中所示的三个斐波那契线。我已经使用 JFreeChart 创建了一个应用程序来尝试完成此操作。但是,这是尝试绘制上一张图片中所示的相同弧线(但作为圆圈)时的结果。
一开始只是觉得不对,但缩小后确实是一个圆圈,只是太大了。
要计算弧线,请画一条线,然后采用斐波那契比率 - 例如,我们使用 .381 - 该线的百分比。如果您查看第一张图片,您会看到最里面的圆弧与直线相交于直线与圆心距离的 0.381% 处。首先我计算这个点。然后我构建了一条从 .381% 点到中心的线。然后我取这条线的距离,应该是半径。然后我用这个半径画圆。
这是计算半径的代码。其中 stop 和 start 是画线的停止点和起点。
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。如果是这样,我不知道如何解决。但这也可能是我逻辑上的一些错误。任何想法,将不胜感激。
编辑:虽然在第一张图片中条形图看起来像是每周条形图,但它们确实是每日条形图。此外,我已经将坐标从数据 space 转换为 x y 坐标。我使用下面的代码来做到这一点。
@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);
我不确定正确的术语,所以让我们调用代表您在显示器上的位置的实际 (x,y)
坐标 "screen space" 让我们调用 (x,y)
坐标图表 "chart space"。
我的问题是我将点从屏幕 space 转换为图表 space,然后计算我的点。相反,我应该计算屏幕上的所有点 space,然后将每个计算出的点转换为图表 space。
其中 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();
这是计算圆上点的方法。其中,endPoint为圆心,radius为起点到终点的距离。
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);
}
}
最后,我将所有这些点都转换为图表 space,并在图表上绘制它们。
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);
}
需要注意一点,圆圈的半径取决于您显示的特定图表的大小。在 1 年图表上从点 a
到点 b
绘制的圆将小于在 5 年图表上从相同点绘制的圆。