JavaFX - 3D 形状

在前面的章节中,我们已经了解了如何在 JavaFX 应用程序中的 XY 平面上绘制 2D 形状。除了这些 2D 形状之外,我们还可以使用 JavaFX 绘制其他几个 3D 形状。

通常,3D 形状是可以在 XYZ 平面上绘制的几何图形。它们由两个或多个维度定义,通常是 length, width and depth。JavaFX 支持的 3D 形状包括 Cylinder、Sphere 和 Box。

上面提到的每个 3D 形状都由一个类表示,所有这些类都属于 javafx.scene.shape 包。名为 Shape3D 的类是 JavaFX 中所有 3 维形状的基类。

创建 3D 形状

要创建 3-Dimensional 形状,需要

实例化相应的类

要创建一个 3-Dimensional 形状,首先你需要实例化它各自的类。例如,如果要创建一个 3D 框,则需要实例化名为 Box 的类,如下所示

Box box = new Box();

设置形状的属性

实例化类后,需要使用 setter 方法设置形状的属性。

例如,要绘制 3D 框,需要传递其 Width、Height、Depth。您可以使用各自的 setter 方法指定这些值,如下所示

//Setting the properties of the Box 
box.setWidth(200.0); 
box.setHeight(400.0);   
box.setDepth(200.0);

将 Shape 对象添加到组中

最后,需要通过将形状的对象作为构造函数的参数传递来将其添加到组中,如下所示。 

//Creating a Group object  
Group root = new Group(box);
S.No

形状和描述

1

Box

长方体是具有length (depth), width, and a height.
长方体是具有 length (depth) 、 width 和 height 的三维形状。

在 JavaFX 中,三维框由名为 Box 的类表示。此类属于 javafx.scene.shape 包。

通过实例化此类,可以在 JavaFX 中创建一个 Box 节点。

此类具有 double 数据类型的 3 个属性

width − 框的宽度

height − 框的高度

depth - 框的深度

2

Cylinder

圆柱体是一种封闭的实体,具有两个平行(大部分为圆形)的底面,由曲面连接。

它由两个参数描述,即其圆形底面的半径和圆柱体的高度。

在 JavaFX 中,圆柱体由名为 Cylinder 的类表示。此类属于 javafx.scene.shape 包。

通过实例化此类,您可以在 JavaFX 中创建一个圆柱体节点。此类具有 double 数据类型的 2 个属性

height − 圆柱体的高度

radius - 圆柱体的半径

3

Sphere

球体定义为与 3D 空间中的给定点的距离相同的点集 r。这个距离 r 是球体的半径,给定的点是球体的中心。

在 JavaFX 中,球体由名为 Sphere 的类表示。此类属于 javafx.scene.shape 包。

通过实例化此类,可以在 JavaFX 中创建一个球体节点。

此类具有名为 radius 的 double 数据类型的属性。它表示 Sphere 的半径。

3D 对象的属性

对于所有 3 维对象,可以在 JavaFX 中设置各种属性。它们在下面列出 

 

JavaFX - 创建一个 Box

长方体是三维立体形状。长方体由 6 个矩形组成,这些矩形以直角放置。使用方形面的长方体是立方体,如果面是矩形,而不是立方体,则它看起来像一个鞋盒。

长方体是具有 length (depth)、width 和 height 的三维形状。在 JavaFX 中,这种类型的三维形状被寻址为 Box;因为它可以是长方体或立方体,具体取决于形状的测量值。

在 JavaFX 中,三维框由名为 Box 的类表示。此类属于 javafx.scene.shape 包。通过实例化此类,可以在 JavaFX 中创建一个 Box 节点。 

绘制 3D 框的步骤

第 1 步:创建 Box

可以通过实例化名为 BOX 的类在 JavaFX 中创建 Box,该类属于包 javafx.scene.shape 。您可以在 Application 类的 start() 方法中实例化此类,如下所示

public class ClassName extends Application {  @Override     public void start(Stage primaryStage) throws Exception {//Creating an object of the class Box Box box = new Box();   }    
}

第 2 步:将属性设置为框

使用 3D 框各自的 setter 方法设置 3D 框的属性 Width、Height 和 Depth ,如以下代码块所示

//Setting the properties of the Box 
box.setWidth(200.0); 
box.setHeight(400.0);   
box.setDepth(200.0);

第 3 步:创建 Group 对象 

在 start() 方法中,通过实例化名为 Group 的类来创建 group 对象,该类属于包 javafx.scene 。将上一步中创建的 Box(节点)对象作为参数传递给 Group 类的构造函数。为了将其添加到组中,应执行此作,如下所示

Group root = new Group(box);

第 4 步:启动应用程序

例1

下面是一个使用 JavaFX 生成 3D 框的程序。将此代码保存在名为 BoxExample.java 的文件中。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.shape.Box; 
import javafx.stage.Stage; public class BoxExample extends Application { @Override public void start(Stage stage) { //Drawing a Box Box box = new Box();  //Setting the properties of the Box box.setWidth(200.0); box.setHeight(400.0);   box.setDepth(200.0); //Creating a Group object  Group root = new Group(box); //Creating a scene object Scene scene = new Scene(root, 600, 300);   //Setting title to the Stage stage.setTitle("Drawing a Box"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); }public static void main(String args[]){ launch(args); } 
}

例2 

在前面的示例中,我们没有指定要从中绘制框的开始和结束坐标。但是,使用 animation 类的 translateX 和 translateY 属性,我们可以在 JavaFX 应用程序上重新定位该框。让我们看一下下面的示例,并将其保存在名为 TranslateBoxExample.java 的文件中。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.shape.Box;
import javafx.scene.paint.Color;
import javafx.scene.transform.Translate;
import javafx.stage.Stage; public class TranslateBoxExample extends Application { @Override public void start(Stage stage) { //Drawing a Box Box box = new Box();  //Setting the properties of the Box box.setWidth(200.0); box.setHeight(200.0);  box.setDepth(200.0);Translate translate = new Translate();       translate.setX(200); translate.setY(150); translate.setZ(25); box.getTransforms().addAll(translate);//Creating a Group object  Group root = new Group(box); //Creating a scene object Scene scene = new Scene(root, 400, 300);scene.setFill(Color.web("#81c483"));	  //Setting title to the Stage stage.setTitle("Translate a Box"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); }public static void main(String args[]){ launch(args); } 
}

JavaFX - 创建圆柱体

圆柱体是一种封闭的实体,具有两个平行(大部分为圆形)的底面,由曲面连接。为了可视化,您可以将 3D 圆柱体视为一堆杂乱的 2D 圆圈,这些圆圈彼此堆叠到一定高度;因此,即使它由两个参数描述,也使其成为三维形状。

绘制 3D 圆柱体的步骤

第 1 步:创建类

通过实例化名为 Cylinder 的类,在 JavaFX 中创建一个 Cylinder 对象,该类属于包 javafx.scene.shape 。您=可以在 start() 方法中实例化此类,如下所示  

public class ClassName extends Application {  @Override     public void start(Stage primaryStage) throws Exception {//Creating an object of the Cylinder class       Cylinder cylinder = new Cylinder();   }    
}

第 2 步:为 Cylinder 设置属性

//Setting the properties of the Cylinder 
cylinder.setHeight(300.0f); 
cylinder.setRadius(100.0f); 

 第 3 步:创建 Group 对象 

Group root = new Group(cylinder);

 第 4 步:启动应用程序

例1

下面的程序演示如何使用 JavaFX 生成 Cylinder。将此代码保存在名为 CylinderExample.java 的文件中。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.shape.CullFace; 
import javafx.scene.shape.Cylinder; 
import javafx.stage.Stage;public class CylinderExample extends Application { @Override public void start(Stage stage) { //Drawing a Cylinder Cylinder cylinder = new Cylinder(); //Setting the properties of the Cylinder cylinder.setHeight(300.0f); cylinder.setRadius(100.0f); //Creating a Group object  Group root = new Group(cylinder); //Creating a scene object Scene scene = new Scene(root, 600, 300);  //Setting title to the Stage stage.setTitle("Drawing a cylinder"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } 
}

 例2

还可以对 3D 形状应用转换。在此示例中,我们尝试在 3D 圆柱体上应用平移转换,并在应用程序上重新定位它。将此代码保存在名为 TranslateCylinderExample.java 的文件中。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.Cylinder;
import javafx.scene.paint.Color;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;public class TranslateCylinderExample extends Application { @Override public void start(Stage stage) { //Drawing a Cylinder Cylinder cylinder = new Cylinder(); //Setting the properties of the Cylinder cylinder.setHeight(150.0f); cylinder.setRadius(100.0f);Translate translate = new Translate();       translate.setX(200); translate.setY(150); translate.setZ(25); cylinder.getTransforms().addAll(translate);	  //Creating a Group object  Group root = new Group(cylinder); //Creating a scene object Scene scene = new Scene(root, 400, 300); scene.setFill(Color.web("#81c483"));//Setting title to the Stage stage.setTitle("Drawing a cylinder"); //Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); } public static void main(String args[]){ launch(args); } 
}

JavaFX - 创建球体

绘制 3D 球体的步骤

步骤 1:创建球体

public class ClassName extends Application { @Override     public void start(Stage primaryStage) throws Exception {//Creating an object of the class Sphere Sphere sphere = new Sphere();   }
}

第 2 步:为球体设置属性

//Setting the radius of the Sphere 
sphere.setRadius(300.0);

 第 3 步:创建 Group 对象 

Group root = new Group(sphere);

 第 4 步:启动应用程序

例1

以下程序演示如何使用 JavaFX 生成 Sphere。将此代码保存在名为 SphereExample.java 的文件中

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.shape.Sphere; public class SphereExample extends Application { @Override public void start(Stage stage) { //Drawing a Sphere  Sphere sphere = new Sphere();  //Setting the properties of the Sphere sphere.setRadius(50.0);   sphere.setTranslateX(200); sphere.setTranslateY(150);      //Creating a Group object  Group root = new Group(sphere); //Creating a scene object Scene scene = new Scene(root, 600, 300);  //Setting title to the Stage stage.setTitle("Drawing a Sphere - draw fill");//Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); }      public static void main(String args[]){ launch(args); } 
}

例2 

 在下面的程序中,我们通过为 JavaFX 应用程序的场景着色来在 JavaFX 中应用一些 CSS。将此代码保存在名为 CSSSphereExample.java 的文件中

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage;
import javafx.scene.paint.Color;
import javafx.scene.shape.Sphere; public class CSSSphereExample extends Application { @Override public void start(Stage stage) { //Drawing a Sphere  Sphere sphere = new Sphere();  //Setting the properties of the Sphere sphere.setRadius(50.0);   sphere.setTranslateX(100); sphere.setTranslateY(150);      //Creating a Group object  Group root = new Group(sphere); //Creating a scene object Scene scene = new Scene(root, 300, 300);scene.setFill(Color.ORANGE);	  //Setting title to the Stage stage.setTitle("Drawing a Sphere");//Adding scene to the stage stage.setScene(scene); //Displaying the contents of the stage stage.show(); }      public static void main(String args[]){ launch(args); } 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解开放寻址法中的三种探测序列

一、引言 开放寻址法是解决散列表中冲突的一种重要方法,当发生冲突(即两个不同的键通过散列函数计算得到相同的散列值)时,它会在散列表中寻找下一个可用的存储位置。而探测序列就是用于确定在发生冲突后,依次尝试哪些…

【双指针题目】

双指针 美丽区间&#xff08;滑动窗口&#xff09;合并数列&#xff08;双指针的应用&#xff09;等腰三角形全部所有的子序列 美丽区间&#xff08;滑动窗口&#xff09; 美丽区间 滑动窗口模板&#xff1a; int left 0, right 0;while (right < nums.size()) {// 增大…

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别&#xff1f; &#xff08;1&#xff09;变量 定义不仅告知编译器变量的类型和名字&#xff0c;还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型&#xff0c;但并不为它分配内存空间…

go-zero学习笔记(三)

利用goctl生成rpc服务 编写proto文件 // 声明 proto 使用的语法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可选) option go_package "./demo";// 如需为 .proto 文件添加注释&#xff0c;请使用 C/C 样式的 // 和 /* ... */…

【25考研】南开软件考研复试复习重点!

一、复试内容 复试采取现场复试的方式。复试分为笔试、机试和面试三部分。三部分合计100分&#xff0c;其中笔试成绩占30%、机试成绩占30%、面试成绩占40%。 1.笔试&#xff1a;专业综合基础测试 考核方式&#xff1a;闭卷考试&#xff0c;时长为90分钟。 笔试考查内容范围…

【最长上升子序列Ⅱ——树状数组,二分+DP,纯DP】

题目 代码&#xff08;只给出树状数组的&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]为尾的LIS的最大长度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…

012-51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创EDA画的一个双层PCB板&#xff0c;所以模块都是插针式&#xff0c;不是表贴的。电路原理图在文末的链接里&#xff0c;PCB图暂时不选择开源。 B站上传的…

对象的实例化、内存布局与访问定位

一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令&#xff0c;首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化…

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…

实验十一 Servlet(二)

实验十一 Servlet(二) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 改造实验10&#xff0c;引入数据库&#xff0c;创建用户表&#xff0c;包括用户名和密码&#xff1a;客户端通过login.jsp发出登录请求&#xff0c;请求…

服务SDK三方新版中央仓库和私服发布详解

预备信息Github仓库发布Gradle版本匹配Gradle项目构建全局变量定义Gradle项目Nexus仓库配置与发布过程Gradle项目发布至Sonatype中央仓库配置过程总结当我们在实现一个项目技术总结、工具类封装或SDK封装,通常是为了方便开发者使用特定服务或平台而提供的一组工具和API。您可能…

openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复

我之前误打误撞遇到一次&#xff0c;直接把openmv的全部端口删除卸载然后重新插上就会自动重新装上一个openmv端口修复成功&#xff0c;大家可以先试试不行再用下面的方法 全部卸载再重新插拔openmv 要解决OpenMV IDE中出现的两个端口问题&#xff0c;可以尝试以下步骤&#x…

LabVIEW双光子成像系统:自主创新,精准成像,赋能科研

双光子成像系统&#xff1a;自主创新&#xff0c;精准成像&#xff0c;赋能科研 第一部分&#xff1a;概述 双光子成像利用两个低能量光子同时激发荧光分子&#xff0c;具有深层穿透、高分辨率、低光损伤等优势。它能实现活体深层组织的成像&#xff0c;支持实时动态观察&…

Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Vue3学习笔记-Vue开发前准备-1

一、安装15.0或更高版本的Node.js node -v npm -v 二、创建Vue项目 npm init vuelatest 三、Vue项目结构 node_modules: Vue项目运行的依赖文件public&#xff1a;资源文件夹package.json&#xff1a;信息描述文件

数据结构:时间复杂度

文章目录 为什么需要时间复杂度分析&#xff1f;一、大O表示法&#xff1a;复杂度的语言1.1 什么是大O&#xff1f;1.2 常见复杂度速查表 二、实战分析&#xff1a;解剖C语言代码2.1 循环结构的三重境界单层循环&#xff1a;线性时间双重循环&#xff1a;平方时间动态边界循环&…

S4 HANA明确税金汇差科目(OBYY)

本文主要介绍在S4 HANA OP中明确税金汇差科目(OBYY)相关设置。具体请参照如下内容&#xff1a; 1. 明确税金汇差科目(OBYY) 以上配置点定义了在外币挂账时&#xff0c;当凭证抬头汇率和税金行项目汇率不一致时&#xff0c;造成的差异金额进入哪个科目。此类情况只发生在FB60/F…

87.(3)攻防世界 web simple_php

之前做过&#xff0c;回顾 12&#xff0c;攻防世界simple_php-CSDN博客 进入靶场 <?php // 显示当前 PHP 文件的源代码&#xff0c;方便调试或查看代码结构 // __FILE__ 是 PHP 的一个魔术常量&#xff0c;代表当前文件的完整路径和文件名 show_source(__FILE__);// 包含…

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;项目基本介绍 &#x1f6a6;项…