gpt4 book ai didi

java - 3D散点图JavaFX : How to show legend and measures near axis

转载 作者:行者123 更新时间:2023-11-30 10:34:04 25 4
gpt4 key购买 nike

Looking this post ,我曾尝试在 javaFX 中实现一个散点图 3D,但遇到了很多困难,其中网格是我的 x、y 和 z 轴,而球体是我的点。

如何沿轴放置图例、轴标签和范围编号?我只能使用没有外部库的 javaFX。我很绝望..我试了好几天..没有结果请帮我谢谢。

代码

    import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class GraphingData extends Application {

private static Random rnd = new Random();

// size of graph
int graphSize = 400;

// variables for mouse interaction
private double mousePosX, mousePosY;
private double mouseOldX, mouseOldY;

private final Rotate rotateX = new Rotate(150, Rotate.X_AXIS);
private final Rotate rotateY = new Rotate(120, Rotate.Y_AXIS);

@Override
public void start(Stage primaryStage) {

// create axis walls
Group grid = createGrid(graphSize);

// initial cube rotation
grid.getTransforms().addAll(rotateX, rotateY);

// add objects to scene
StackPane root = new StackPane();
root.getChildren().add(grid);

root.setStyle( "-fx-border-color: red;");
// create bars
double gridSizeHalf = graphSize / 2;
double size = 30;

//Drawing a Sphere
Sphere sphere = new Sphere();

//Setting the properties of the Sphere
sphere.setRadius(10.0);

sphere.setTranslateX(-50);
sphere.setTranslateY(-50);

//Preparing the phong material of type specular color
PhongMaterial material6 = new PhongMaterial();

//setting the specular color map to the material
material6.setDiffuseColor(Color.GREEN);

sphere.setMaterial(material6);

grid.getChildren().addAll(sphere);

// scene
Scene scene = new Scene(root, 1600, 900, true, SceneAntialiasing.BALANCED);
scene.setCamera(new PerspectiveCamera());

scene.setOnMousePressed(me -> {
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged(me -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
rotateX.setAngle(rotateX.getAngle() - (mousePosY - mouseOldY));
rotateY.setAngle(rotateY.getAngle() + (mousePosX - mouseOldX));
mouseOldX = mousePosX;
mouseOldY = mousePosY;

});

makeZoomable(root);

primaryStage.setResizable(false);
primaryStage.setScene(scene);
primaryStage.show();

}

/**
* Axis wall
*/
public static class Axis extends Pane {

Rectangle wall;

public Axis(double size) {

// wall
// first the wall, then the lines => overlapping of lines over walls
// works
wall = new Rectangle(size, size);
getChildren().add(wall);

// grid
double zTranslate = 0;
double lineWidth = 1.0;
Color gridColor = Color.RED;

for (int y = 0; y <= size; y += size / 10) {

Line line = new Line(0, 0, size, 0);
line.setStroke(gridColor);
line.setFill(gridColor);
line.setTranslateY(y);
line.setTranslateZ(zTranslate);
line.setStrokeWidth(lineWidth);

getChildren().addAll(line);

}

for (int x = 0; x <= size; x += size / 10) {

Line line = new Line(0, 0, 0, size);
line.setStroke(gridColor);
line.setFill(gridColor);
line.setTranslateX(x);
line.setTranslateZ(zTranslate);
line.setStrokeWidth(lineWidth);

getChildren().addAll(line);

}

}

public void setFill(Paint paint) {
wall.setFill(paint);
}

}

public void makeZoomable(StackPane control) {

final double MAX_SCALE = 20.0;
final double MIN_SCALE = 0.1;

control.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {

@Override
public void handle(ScrollEvent event) {

double delta = 1.2;

double scale = control.getScaleX();

if (event.getDeltaY() < 0) {
scale /= delta;
} else {
scale *= delta;
}

scale = clamp(scale, MIN_SCALE, MAX_SCALE);

control.setScaleX(scale);
control.setScaleY(scale);

event.consume();

}

});

}

/**
* Create axis walls
*
* @param size
* @return
*/
private Group createGrid(int size) {

Group cube = new Group();

// size of the cube
Color color = Color.LIGHTGRAY;

List<Axis> cubeFaces = new ArrayList<>();
Axis r;

// back face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.5 * 1), 1.0));
r.setTranslateX(-0.5 * size);
r.setTranslateY(-0.5 * size);
r.setTranslateZ(0.5 * size);

cubeFaces.add(r);

// bottom face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.4 * 1), 1.0));
r.setTranslateX(-0.5 * size);
r.setTranslateY(0);
r.setRotationAxis(Rotate.X_AXIS);
r.setRotate(90);

cubeFaces.add(r);

// right face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.3 * 1), 1.0));
r.setTranslateX(-1 * size);
r.setTranslateY(-0.5 * size);
r.setRotationAxis(Rotate.Y_AXIS);
r.setRotate(90);

// cubeFaces.add( r);

// left face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.2 * 1), 1.0));
r.setTranslateX(0);
r.setTranslateY(-0.5 * size);
r.setRotationAxis(Rotate.Y_AXIS);
r.setRotate(90);

cubeFaces.add(r);

// top face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.1 * 1), 1.0));
r.setTranslateX(-0.5 * size);
r.setTranslateY(-1 * size);
r.setRotationAxis(Rotate.X_AXIS);
r.setRotate(90);

// cubeFaces.add( r);

// front face
r = new Axis(size);
r.setFill(color.deriveColor(0.0, 1.0, (1 - 0.1 * 1), 1.0));
r.setTranslateX(-0.5 * size);
r.setTranslateY(-0.5 * size);
r.setTranslateZ(-0.5 * size);

// cubeFaces.add( r);

cube.getChildren().addAll(cubeFaces);

return cube;
}

public static double normalizeValue(double value, double min, double max, double newMin, double newMax) {

return (value - min) * (newMax - newMin) / (max - min) + newMin;

}

public static double clamp(double value, double min, double max) {

if (Double.compare(value, min) < 0)
return min;

if (Double.compare(value, max) > 0)
return max;

return value;
}

public static Color randomColor() {
return Color.rgb(rnd.nextInt(255), rnd.nextInt(255), rnd.nextInt(255));
}

public static void main(String[] args) {
launch(args);
}
}

最佳答案

下面是在轴上创建一些度量的基本思路。它不是生产就绪的,但应该给你足够的开始。

private Group createGrid(int size) {

// existing code omitted...

cube.getChildren().addAll(cubeFaces);


double gridSizeHalf = size / 2;
double labelOffset = 30 ;
double labelPos = gridSizeHalf - labelOffset ;

for (double coord = -gridSizeHalf ; coord < gridSizeHalf ; coord+=50) {
Text xLabel = new Text(coord, labelPos, String.format("%.0f", coord));
xLabel.setTranslateZ(labelPos);
xLabel.setScaleX(-1);
Text yLabel = new Text(labelPos, coord, String.format("%.0f", coord));
yLabel.setTranslateZ(labelPos);
yLabel.setScaleX(-1);
Text zLabel = new Text(labelPos, labelPos, String.format("%.0f", coord));
zLabel.setTranslateZ(coord);
cube.getChildren().addAll(xLabel, yLabel, zLabel);
zLabel.setScaleX(-1);
}

return cube;
}

我只想在图表外放置一个图例,它只是一个不旋转的 2D 网格 Pane ...

关于java - 3D散点图JavaFX : How to show legend and measures near axis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41884239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com