Как написать уравнение сердца - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь расположить 100 сотен частиц в форме сердца.Частицы представляют собой круги и имеют положение топора и y на панели.

This is what happens

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 = частицы(список)

Понятия не имею, что я сделал не так с реализацией уравнения.Я также пытался использовать Math.toRadians в cos, sin, так как я прочитал, что они требуют, чтобы это работало.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

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()))

Более подробное объяснение:

Это интересновопрос, особенно касательно котлина.Быстрый (популярное имя поисковой системы здесь) поиск говорит мне, что формула, которую вы используете:

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

Глядя на ваш код, все выглядит хорошо ... за исключением 3 вычислений для y, каждый на новой строке, и это виновник вашего «вопроса», потому что каждый из них рассматривается отдельно, а не частью y вычисления.

Это можно увидеть в форме сердца:

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

Посмотрите на эти (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

Компилятор жалуется, что это "Не утверждение"


В отдельном примечании есть несколько улучшений, которые вы могли быделать в вашем коде (например, извлекать дубликаты в переменную и т. д.)

0 голосов
/ 13 мая 2018
                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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...