【问题标题】:How to write a heart equation如何写一个心脏方程
【发布时间】:2018-10-22 20:20:09
【问题描述】:

我正在尝试将 10000 个粒子放置在心形中。 粒子是圆形,在窗格中具有 x 和 y 位置。

for (p in ps) {
    val index = ps.indexOf(p).toDouble()
    var x = 16 * Math.pow(Math.sin(index * angle.toDouble()), 3.0)
    //var y = Math.sqrt(Math.cos(index)) * Math.cos(400 * index) + Math.sqrt(Math.abs(index) - 0.4) * Math.pow((4 - index * index), 0.1)
    var y = (13 * Math.cos(index * angle.toDouble()))
        -(5 * Math.cos(2 * index * angle.toDouble()))
        -(2 * Math.cos(3 * index * angle.toDouble()))
        -(Math.cos(4 * index * angle.toDouble()))

    p.layoutX = startX + x
    p.layoutY = startY + y
}

p = 粒子

ps = 粒子(列表)

我不知道我在方程式实现中做错了什么。 我还尝试在 cos 中使用 Math.toRadians,sin,因为我读到他们需要这样做。

【问题讨论】:

  • 你应该使用ps.withIndex().forEach { (p, index) ->而不是for (p in ps) { val index = ...

标签: kotlin shape equation


【解决方案1】:

TLDR;y 的计算移至一行:

var y = (13 * Math.cos(index * angle.toDouble())) - (5 * Math.cos(2 * index * angle.toDouble())) - (2 * Math.cos(3 * index * angle.toDouble())) - (Math.cos(4 * index * angle.toDouble()))

更长的解释:

这是一个有趣的问题,尤其是关于 Kotlin。快速(这里是流行的搜索引擎名称)搜索告诉我您使用的公式是:

x(T)=16sin^3(T) 
y(T)=13cos(T)−5cos(2T)−2cos(3T)−cos(4T)

查看您的代码,一切似乎都很好...除了 y 的 3 个计算,每个计算都在新行上,这是您的“问题”的罪魁祸首,因为它们都是单独处理的,而不是y 计算的一部分。

这可以从心形中看出:

val y = (13 * Math.cos(angle)).toFloat()

val y = (13 * Math.cos(angle) - 5 * Math.cos(2 * angle)).toFloat()

val y = (13 * Math.cos(angle) - 5 * Math.cos(2 * angle) - 2 * Math.cos(3 * angle)).toFloat()

val y = (13 * Math.cos(angle) - 5 * Math.cos(2 * angle) - 2 * Math.cos(3 * angle) - Math.cos(4 * angle)).toFloat()    

看看这些(Kotlin):

var sum = 10 + 10

println("sum=$sum") // prints sum=20

sum = 10 + 10
+ 10

println("sum=$sum") // also prints sum=20 (!)

相比之下,在 Java 中,这是真的:

int sum = 10 + 10;
System.out.println("sum=" + sum); // prints sum=20

sum = 10 + 10
+10;
System.out.println("sum=" + sum); // prints sum=30 (!), as expected

sum = 10 + 10;
+10; // doesn't compile

编译器抱怨这是"Not a statement"


另外,您可以对代码进行一些改进(例如,将重复项提取到变量中等)

【讨论】:

    【解决方案2】:
                    val index = -ps.size + ps.indexOf(p).toDouble()
                    val angle = 360 / ps.size
    
                    var i = index * angle
                    var x = 16 * Math.pow(Math.sin(Math.toRadians(i)), 3.0)
                    var y = 13 * Math.cos(Math.toRadians(i)) -
                            (5 * Math.cos(Math.toRadians(2 * i)))
                    -(2 * Math.cos(Math.toRadians(3 * i)))
                    -(Math.cos(Math.toRadians(4 * i)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-15
      • 2020-04-16
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多