2012-10-24 18 views
6

मुझे जावाएफएक्स में क्यूबिक कर्व के साथ कठिन समय है। उदाहरण के लिए कोई कैसे आकर्षित कर सकता है: y = x^3? वक्र खींचने के लिए तंत्र बहुत कमजोर लग रहा है।क्यूबिक कर्व जावाएफएक्स

वक्र के अंत बिंदुओं में से किसी एक को नोड से कनेक्ट करना भी संभव है, इसलिए जब उस नोड का स्थान वक्र को बदल देता है?

धन्यवाद।

उत्तर

18

मुझे लगता है कि जावाएफएक्स में क्यूबिकक्रूव काफी काम नहीं करते हैं जैसा कि आपको लगता है कि वे कर सकते हैं। एक जावाएफएक्स क्यूबिक कर्व एक Bezier curve है जो क्यूबिक बहुपदों से काफी अलग है जैसे y = x^3 आप आमतौर पर हाईस्कूल गणित में सामना करते हैं। बेजियर वक्र के बारे में जो कुछ भी आप कभी नहीं जानना चाहते थे वह here है।

बेजियर वक्र अक्सर कंप्यूटर ग्राफिक्स में चिकनी वक्र उत्पन्न करने के लिए उपयोग किया जाता है। वे वक्र में हेरफेर करने के लिए प्रारंभ और अंत बिंदुओं और नियंत्रण बिंदुओं का एक सेट द्वारा परिभाषित किया जाता है। आप सबसे अच्छा देख सकते हैं कि यह एक इंटरैक्टिव उदाहरण के साथ खेलकर कैसे काम करता है जहां आप विभिन्न घटता बनाने के लिए प्रारंभ, अंत और नियंत्रण बिंदुओं के चारों ओर खींचते हैं।

उदाहरण के लिए कोई कैसे आकर्षित कर सकता है: y = x^3?

इसे हल करने बेज़ियर समीकरण इस तरह y के रूप में एक बहुपद को कम करने के लिए संभव हो सकता है = एक्स^3, तुम कहाँ गणितज्ञों की क्षमता की तुलना में अधिक होने जा रहा है math.stackexchange.com पर कि सवाल पूछने के लिए चाहते हो सकता है उदाहरण के लिए, मैं।

क्या वक्र के अंत बिंदुओं में से किसी एक को नोड से कनेक्ट करना संभव है, इसलिए जब उस नोड का स्थान वक्र को बदल देता है?

हां, नीचे नमूना आवेदन आज़माएं जहां वक्र अंत और नियंत्रण बिंदु ड्रैग करने योग्य नोड्स से बंधे हैं। वक्र एंकर नोड्स के स्थान में परिवर्तनों को अपनाना है क्योंकि उन्हें चारों ओर खींच लिया जाता है।

import javafx.application.Application; 
import javafx.beans.property.DoubleProperty; 
import javafx.event.EventHandler; 
import javafx.scene.*; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

/** Example of how a cubic curve works, drag the anchors around to change the curve. */ 
public class CubicCurveManipulator extends Application { 
    public static void main(String[] args) throws Exception { launch(args); } 
    @Override public void start(final Stage stage) throws Exception { 
    CubicCurve curve = createStartingCurve(); 

    Line controlLine1 = new BoundLine(curve.controlX1Property(), curve.controlY1Property(), curve.startXProperty(), curve.startYProperty()); 
    Line controlLine2 = new BoundLine(curve.controlX2Property(), curve.controlY2Property(), curve.endXProperty(), curve.endYProperty()); 

    Anchor start = new Anchor(Color.PALEGREEN, curve.startXProperty(), curve.startYProperty()); 
    Anchor control1 = new Anchor(Color.GOLD,  curve.controlX1Property(), curve.controlY1Property()); 
    Anchor control2 = new Anchor(Color.GOLDENROD, curve.controlX2Property(), curve.controlY2Property()); 
    Anchor end  = new Anchor(Color.TOMATO, curve.endXProperty(),  curve.endYProperty()); 

    stage.setTitle("Cubic Curve Manipulation Sample"); 
    stage.setScene(new Scene(new Group(controlLine1, controlLine2, curve, start, control1, control2, end), 400, 400, Color.ALICEBLUE)); 
    stage.show(); 
    } 

    private CubicCurve createStartingCurve() { 
    CubicCurve curve = new CubicCurve(); 
    curve.setStartX(100); 
    curve.setStartY(100); 
    curve.setControlX1(150); 
    curve.setControlY1(50); 
    curve.setControlX2(250); 
    curve.setControlY2(150); 
    curve.setEndX(300); 
    curve.setEndY(100); 
    curve.setStroke(Color.FORESTGREEN); 
    curve.setStrokeWidth(4); 
    curve.setStrokeLineCap(StrokeLineCap.ROUND); 
    curve.setFill(Color.CORNSILK.deriveColor(0, 1.2, 1, 0.6)); 
    return curve; 
    } 

    class BoundLine extends Line { 
    BoundLine(DoubleProperty startX, DoubleProperty startY, DoubleProperty endX, DoubleProperty endY) { 
     startXProperty().bind(startX); 
     startYProperty().bind(startY); 
     endXProperty().bind(endX); 
     endYProperty().bind(endY); 
     setStrokeWidth(2); 
     setStroke(Color.GRAY.deriveColor(0, 1, 1, 0.5)); 
     setStrokeLineCap(StrokeLineCap.BUTT); 
     getStrokeDashArray().setAll(10.0, 5.0); 
    } 
    } 

    // a draggable anchor displayed around a point. 
    class Anchor extends Circle { 
    Anchor(Color color, DoubleProperty x, DoubleProperty y) { 
     super(x.get(), y.get(), 10); 
     setFill(color.deriveColor(1, 1, 1, 0.5)); 
     setStroke(color); 
     setStrokeWidth(2); 
     setStrokeType(StrokeType.OUTSIDE); 

     x.bind(centerXProperty()); 
     y.bind(centerYProperty()); 
     enableDrag(); 
    } 

    // make a node movable by dragging it around with the mouse. 
    private void enableDrag() { 
     final Delta dragDelta = new Delta(); 
     setOnMousePressed(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      // record a delta distance for the drag and drop operation. 
      dragDelta.x = getCenterX() - mouseEvent.getX(); 
      dragDelta.y = getCenterY() - mouseEvent.getY(); 
      getScene().setCursor(Cursor.MOVE); 
     } 
     }); 
     setOnMouseReleased(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      getScene().setCursor(Cursor.HAND); 
     } 
     }); 
     setOnMouseDragged(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      double newX = mouseEvent.getX() + dragDelta.x; 
      if (newX > 0 && newX < getScene().getWidth()) { 
      setCenterX(newX); 
      } 
      double newY = mouseEvent.getY() + dragDelta.y; 
      if (newY > 0 && newY < getScene().getHeight()) { 
      setCenterY(newY); 
      } 
     } 
     }); 
     setOnMouseEntered(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
      getScene().setCursor(Cursor.HAND); 
      } 
     } 
     }); 
     setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
      getScene().setCursor(Cursor.DEFAULT); 
      } 
     } 
     }); 
    } 

    // records relative x and y co-ordinates. 
    private class Delta { double x, y; } 
    } 
} 

नमूना कार्यक्रम उत्पादन:

cubiccurve sample program output

+1

धन्यवाद, हालांकि मैं इस मुद्दे को हल करने में सक्षम नहीं किया है, यह एक महान जवाब था और मैं लगभग भूल गया कि गणित stackoverflow अस्तित्व में ... – user1479589

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