2012-10-24 33 views
6

Tôi đang gặp khó khăn với CubicCurve trong JavaFX. Làm thế nào có thể vẽ ví dụ: y = x^3? cơ chế vẽ đường cong trông rất khó sử dụng.CubicCurve JavaFX

Cũng có thể kết nối một trong các điểm cuối của đường cong với nút khác, vì vậy khi vị trí của nút đó thay đổi đường cong thích nghi với nó?

Cảm ơn.

Trả lời

18

Tôi nghĩ CubicCurves trong JavaFX không hoạt động như bạn nghĩ. Một khối JavaFX CubicCurve là một số Bezier curve khác với các đa thức khối như y = x^3 mà bạn thường gặp trong toán học trung học. Mọi thứ bạn không bao giờ muốn biết về đường cong Bezier là here.

Đường cong Bezier thường được sử dụng để tạo các đường cong mượt mà trong đồ họa máy tính. Chúng được xác định bởi điểm bắt đầu và điểm kết thúc và một tập hợp các điểm điều khiển để thao tác với đường cong. Bạn có thể thấy cách hoạt động tốt nhất bằng cách chơi với một ví dụ tương tác, nơi bạn kéo xung quanh điểm bắt đầu, điểm kết thúc và điểm điều khiển để tạo thành các đường cong khác nhau.

Làm cách nào để vẽ ví dụ: y = x^3?

Trong khi nó có thể để giải quyết các phương trình Bezier để giảm đến một đa thức như y = x^3, bạn có thể muốn hỏi câu hỏi đó trên math.stackexchange.com nơi tầm cỡ của các nhà toán học sẽ là cao hơn nhiều so , ví dụ, tôi.

có thể kết nối một trong các điểm cuối của đường cong với nút khác không, vì vậy khi vị trí của nút đó thay đổi đường cong thích nghi với nó?

Có, hãy thử ứng dụng mẫu bên dưới nơi điểm cuối đường cong và điểm điều khiển bị ràng buộc với các nút có thể kéo được. Đường cong thích nghi với những thay đổi trong vị trí của các nút neo khi chúng được kéo xung quanh.

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

đầu ra Chương trình mẫu:

cubiccurve sample program output

+1

Cảm ơn, mặc dù tôi havent được khả năng giải quyết vấn đề này, đây là một câu trả lời tuyệt vời và tôi gần như quên rằng stackoverflow toán tồn tại ... – user1479589