javafx框架tornadofx画个心形

Wesley13
• 阅读 738

javafx框架tornadofx画个心形

import javafx.animation.AnimationTimer
import javafx.application.Application
import javafx.application.Platform
import javafx.geometry.Pos
import javafx.scene.canvas.GraphicsContext
import javafx.scene.control.RadioButton
import javafx.scene.paint.Color
import tornadofx.*
import java.util.*
import kotlin.math.PI
import kotlin.math.cos
import kotlin.math.sin

fun main(args: Array<String>) {
    Application.launch(TestApp::class.java, *args)
}

class TestApp : App(TestView::class)
class TestView : View("逐个显示图形") {
    val isRun = booleanProperty()
    val pNums = intProperty()
    val aniMate = AniTimer()
    var t = -PI
    var renderedList: MutableList<Point> = LinkedList<Point>()

val step= doubleProperty(0.01)
    lateinit var context: GraphicsContext
    override val root = borderpane {

        top = hbox(10) {
            style {
                alignment = Pos.CENTER
            }
            label("点密度")
            togglegroup {
                listOf(0.01, 0.03, 0.05, 0.07, 0.1).map { v ->
                    radiobutton(v.toString(), this, v) { if (v === 0.01) isSelected = true }
                }
                selectedToggleProperty().addListener { _, _, newValue ->
//                    step.value = (selectedToggle as RadioButton).text.toDouble()
                    step.value = (newValue as RadioButton).text.toDouble()
                }
            }
            button("start") {
                isRun.addListener { _,_,isrun->
                    if (isrun)
                        this.text = "Pause"
                    else
                        this.text = "Start"
                }
                action {
                    if (isRun.value) {
                        aniMate.stop()
                        this.text = "Start"
                        isRun.value = false
                    } else {
                        t = -PI
                        renderedList.clear()
                        pNums.value=0
                        aniMate.start()
                        this.text = "Pause"
                        isRun.value = true
                    }
                }
            }
            label(pNums.stringBinding { "当前点数:$it" })
        }

        center = canvas(800.0, 600.0) {
            style {
                alignment = Pos.CENTER
            }
            context = this.graphicsContext2D
            paddingAll = 30
        }
    }

    inner class AniTimer : AnimationTimer() {
        var lastTime = 0L
        val r = 10.0
        var syncLock = Any()
        override fun handle(now: Long) {
            if ((now - lastTime) > 10000000) {
                lastTime = now
            } else {
                return
            }
            Platform.runLater {
                val y = 200 + (2 * cos(t) - cos(2 * t)) * -80
                val x = 400 + (2 * sin(t) - sin(2 * t)) * 100
                val p = Point(x, y)
                // 锁住,防止其他线程修改
                synchronized(syncLock) {
                    // 添加历史记录
                    renderedList.add(p)
                    // 清屏
                    context.fill = Color.WHITE
                    context.clearRect(0.0, 0.0, 800.0, 600.0)
                    context.fill =  Color.RED
                    // 渲染点
                    for (point in renderedList) {
                        context.fillOval(point.x, point.y, r, r)

                    }
                    pNums.value += 1
                    t += step.value
                    // 控制点的数量
                    if (t > PI) {
                        aniMate.stop()
                        isRun.value=false
                    }
                }
            }
        }
    }
}

class Point(val x: Double, val y: Double)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
vue element table 表头添加图标
!(https://oscimg.oschina.net/oscnet/189d567e07e0844612470867b06a35c0aaf.jpg)!(https://oscimg.oschina.net/oscnet/dc3b454d663d8618924b78796345a145b3f.jpg)1<template
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql系列(三)——mysql架构与存储引擎
一、MySql逻辑架构!(https://oscimg.oschina.net/oscnet/up35e1824330cd1df7ac66652b9b1dbc41965.png)1.连接层!(https://oscimg.oschina.net/oscnet/up272cb2634e262cc2df52220a063
Stella981 Stella981
3年前
Jenkins流水线即代码之扩展共享库
!(https://oscimg.oschina.net/oscnet/ab8ee75c43cb1a3fd0fac241648861b03c5.gif)!(https://oscimg.oschina.net/oscnet/1a35fdf03222f188f706711d2b43eae6a14.gif)!(https://osci
Stella981 Stella981
3年前
Spring Boot日志集成
!(https://oscimg.oschina.net/oscnet/1bde8e8d00e848be8b84e9d1d44c9e5c.jpg)SpringBoot日志框架SpringBoot支持JavaUtilLogging,Log4j2,Lockback作为日志框架,如果你使用star
Wesley13 Wesley13
3年前
Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
!(https://oscimg.oschina.net/oscnet/3e08a942dd884e9ab82b63a1f3c4aada.jpg"未命名文件.jpg")Java技术栈不可错过的Java 技术公众号!(https://oscimg.oschina.net/oscnet/00fcff52518e
Stella981 Stella981
3年前
Js使用面向对象和面向过程的方法实现拖拽物体的效果
1.面向过程的拖拽实现代码:!(https://oscimg.oschina.net/oscnet/d680c759957babef2fec0902676eaa35ad9.gif)<!DOCTYPEhtml<html<head<titledragDiv</title
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究