Вращение равностороннего треугольника в его центре - PullRequest
0 голосов
/ 01 апреля 2020

Я пишу Kotlin функцию класса Java Graphics, которая заполнит равносторонний треугольник с центром в заданных координатах. Я сейчас пытаюсь добавить функциональность, чтобы повернуть треугольник theta в градусах.

Читая в повороте точки, я нашел уравнения x′ = xcosθ − ysinθ и y′ = ycosθ + xsinθ, которые в дополнение к переводу x и y в начало координат до поворота и затем к переводу результата обратно, похоже, решение, которое я ищу.

Однако при реализации оказывается, что треугольник почти вращается в моделируемом трехмерном пространстве.

Мой код

fun Graphics.fillTriangle(x: Int, y: Int, sideLength: Int, theta: Int = 0) {
    var xCords = arrayOf(x - (sideLength / 2),
                         x + (sideLength / 2),
                         x)

    var yCords = arrayOf((y + (sideLength / (2 * sqrt(3.0)))).toInt(),
                         (y + (sideLength / (2 * sqrt(3.0)))).toInt(),
                         (y - (sideLength / sqrt(3.0))).toInt())

    if(theta != 0) {
        for(i in 0..2) {
            xCords[i] = ((xCords[i]-x) * cos(toRadians(theta)) - (yCords[i]-y) * sin(toRadians(theta))).toInt() + x
            yCords[i] = ((yCords[i]-y) * cos(toRadians(theta)) + (xCords[i]-x) * sin(toRadians(theta))).toInt() + y
        }
    }

    fillPolygon(xCords.toIntArray(), yCords.toIntArray(), 3)
}

Что-то не так с моей реализацией?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Я не проверял вашу математику, но я бы предложил более простой подход. Для каждой точки вычислите местоположение треугольника с центром в начале координат, а затем добавьте смещение. Равносторонний треугольник - это всего три точки на окружности, на расстоянии 120 градусов друг от друга, поэтому математика равна (x, y) = (r*cos(theta), r*sin(theta)).

fun Graphics.fillTriangle(x: Int, y: Int, sideLength: Int, theta: Int = 0) {
    val radius = sideLength / sqrt(3.0)
    val angles = (0..2).map { it * (toRadians(theta) + toRadians(120)) }
    val xCoords = angles.map { (radius * cos(it) + x).roundToInt() }.toIntArray()
    val yCoords = angles.map { (radius * sin(it) + y).roundToInt() }.toIntArray()
    fillPolygon(xCoords, yCoords, 3)
}
0 голосов
/ 01 апреля 2020

Я понял это. Я изменял координату в массиве xCord, который затем использовался для вычисления новой координаты в массиве yCord.

Мой новый код

var newX = (((xCords[i]-x) * cos(toRadians(theta)) - (yCords[i]-y)*sin(toRadians(theta)))+ x).toInt()
var newY = (((yCords[i]-y) * cos(toRadians(theta)) + (xCords[i]-x) * sin(toRadians(theta))) + y).toInt()

xCords[i] = newX
yCords[i] = newY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...