2017-04-26 58 views
7

मैं ऐसे अनुप्रयोग बनाने का प्रयास कर रहा हूं जो इनके समान फिबोनाची आर्क बनाता है। Stock Chart Fibonacci Arcsड्रा फाइबोनैकी आर्क

हालांकि, मुझे आर्क की बजाय पूर्ण सर्कल चाहिए, और मैं तस्वीर में दिखाए गए तीन फिबोनाची लाइनों से अधिक आकर्षित करना चाहता हूं। मैंने इसे पूरा करने के प्रयास में JFreeChart का उपयोग करके एक एप्लिकेशन बनाया है। हालांकि, पिछली तस्वीर में दिखाए गए एक ही आर्क (लेकिन सर्कल के रूप में) को खींचने का प्रयास करते समय परिणाम यहां दिया गया है। My app zoomed in

प्रारंभ में, यह गलत लगता है, लेकिन जब मैं ज़ूम आउट करता हूं, तो यह वास्तव में एक सर्कल है, लेकिन यह बहुत बड़ा तरीका है। enter image description here

arcs की गणना करने के लिए, आप एक रेखा खींचते हैं, फिर एक फाइबोनैकी अनुपात लें - उदाहरण के लिए .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); 

यहाँ एक लाइन

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 पर होंगे। यदि ऐसा है, तो मुझे नहीं पता कि इसे कैसे ठीक किया जाए। लेकिन यह मेरे तर्क में कुछ त्रुटि भी हो सकती है। किसी भी सुझाव की सराहना की जाएगी।

संपादित करें: जबकि बार दिखते हैं कि वे पहली तस्वीर में साप्ताहिक बार हो सकते हैं, वे वास्तव में दैनिक बार हैं। साथ ही, मैंने पहले ही डेटा स्पेस से एक्स वाई निर्देशांक में निर्देशांक परिवर्तित कर दिए हैं। मैं ऐसा करने के लिए नीचे इस कोड का उपयोग करता हूं।

@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

हाँ, पैमाने छवि को फेंक रहा है इसलिए यह जानना मुश्किल है कि क्या हो रहा है। आप क्या कर सकते हैं पहली छवि के समान पैमाने पर अपने पैमाने को स्केल करें। एक्स अक्ष के लिए, स्केल की इकाई सप्ताह है। गणना करें कि सर्कल के केंद्र और रेखा के चौराहे के बीच कितनी इकाइयां हैं, और फिर गणना के अनुपात का उपयोग करके अपने पैमाने को स्केल करें। दोनों चार्टों पर इकाइयों से मेल खाना चाहिए। वाई धुरी के लिए वही करें। –

+0

@ निकिक्सबर्ट सही है: ['XYShapeAnnotation'] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/annotations/XYLineAnnotation.html) निर्देशांक" डेटा स्पेस "में हैं, के लिए [उदाहरण] (http://stackoverflow.com/a/6802375/230513)। – trashgod

+1

मैं आपको इसे डिबग करने में मदद करना चाहता हूं लेकिन आप पर्याप्त जानकारी प्रदान नहीं करते हैं - या इसमें बहुत अधिक समय लगेगा। अनुमान: गलत अनुपात, आपकी लाइन बस लंबी है, तो आपको लगता है, मिश्रित प्रारंभ/रोक, अंतरिक्ष रूपांतरण। क्या आप एक पूर्ण कोड उदाहरण प्रदान कर सकते हैं - शायद गिथब पर? या आप कुछ वास्तविक संख्या प्रदान कर सकते हैं? –

उत्तर

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

सर्कल पर बिंदुओं की गणना करने का तरीका यहां दिया गया है।जहां, एंडपॉइंट केंद्र बिंदु है, और त्रिज्या प्रारंभ बिंदु से अंत बिंदु तक दूरी है।

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

एक बात नोट करने के लिए, हलकों की त्रिज्या आप एक विशिष्ट चार्ट का कितना दिखा रहे हैं पर निर्भर है। बिंदु a से b पर 1 वर्ष चार्ट पर खींचा गया एक चक्र उन बिंदुओं से 5 वर्ष के चार्ट पर खींचे गए सर्कल से छोटा होगा।

संबंधित मुद्दे