【发布时间】:2017-04-26 23:55:23
【问题描述】:
但是,我想要完整的圆而不是圆弧,并且我想要绘制的不仅仅是图片中显示的三条斐波那契线。我创建了一个使用 JFreeChart 的应用程序来尝试完成此操作。但是,这是尝试绘制上图中所示的相同弧线(但为圆形)时的结果。
一开始,它只是看起来不对,但当我缩小时,它确实是一个圆圈,但它太大了。
要计算弧线,请画一条线,然后取一个斐波那契比率 - 例如,我们使用 0.381 - 这条线的百分比。如果您查看第一张图片,您会看到最里面的弧线与直线相交,直线距离圆心的距离为 0.381%。首先我计算这一点。然后我构建一条从 0.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。如果是这种情况,我不知道如何解决它。但这也可能是我的逻辑中的一些错误。任何想法,将不胜感激。
编辑:虽然第一张图片中的柱状图看起来可能是每周柱形图,但它们确实是每日柱形图。另外,我已经将坐标从数据空间转换为 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 轴执行相同操作。
-
@NickZiebert 是正确的:
XYShapeAnnotation坐标位于 example 的“数据空间”中。 -
我想帮助您调试它,但您没有提供足够的信息 - 否则会花费太多时间。猜测:不正确的比例,你的线只是比你想象的长,混合开始/停止,空间转换。您能否提供一个完整的代码示例 - 也许在 github 上?或者你能提供一些真实的数字吗?
-
谢谢@A.Binzxxxxxx。不过,在您发送此消息之前,我已经想通了。
标签: java math jfreechart fibonacci