Как выбрать все позиции пикселей для линии между заданными точками? - PullRequest
1 голос
/ 13 июля 2020

Я работаю над проектом, который состоит из рисования линии, НО, самое главное, мне нужно получить позицию Y на каждой позиции X. Итак, для каждого X мне нужна буква Y. Рисование линии и определение позиций работают нормально, пока я рисую медленно. Но когда я перемещаю курсор быстрее, даже если линия рисуется, позиции не сохраняются для каждого X, и это проблема. Вы можете просто взглянуть на изображение ниже.

введите описание изображения здесь

Как видите, зеленая линия - это линия, которую предоставляет Unity, LineRenderer. Чтобы доказать свою проблему, я нарисовал кружок в каждой позиции, сохраненной на Линии. Итак, даже если линия проведена, я не могу сохранить свои позиции. Есть ли способ решить эту проблему? Спасибо и удачного дня!

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Если я правильно понял, ваша проблема вызвана тем, что координаты отбираются редко, вы можете просто сосредоточиться на получении значений при перемещении курсора, а затем нарисовать линию, это будет более быстрый способ.

1 голос
/ 13 июля 2020

Если я правильно понял ваш вопрос, теперь вы хотите найти все пиксели, которые l ie на линиях, построенных заданными точками на изображении.

Не совсем уверен, так как набирал текст на смартфоне прямо сейчас, но Я думаю, вы могли бы сделать что-то вроде

// Expects givenPoints in pixel coordinates for positions to draw lines between
public List<Vector2Int> CalculateLinePixels(List<Vector2Int> givenPoints)
{
    var output = new List<Vector2Int>();
    // Already add the first point once
    output.Add(givenPoints[0]);

    // start with the second point and calculate the line points back 
    // between the current and the point before
    for (var i = 1; i < givenPoints.Count; i++)
    {
        var startPoint = givenPoints[i - 1];
        var endPoint = givenPoints[i];

        // get the difference between them in pixels
        var dif = endPoint - startPoint;
        // Get the pixel step in Y per pixel step on X
        var step = dif.y / (float)dif.x;

        // go through all the pixels on the X axis between both points
        // excluding the first as these should already match the 
        // startPoint (== last endPoint)
        //
        // Note that for now this assumes that the line goes always strict from left to right 
        // -> no forth and back drawing, no vertical drawing
        for (var x = 1; x < dif.x; x++)
        {
            // every step in X add one step in Y starting from the first points Y
            var y = Mathf.RoundToInt(step * x);

            // Add the new line point
            output.Add(startPoint + new Vector2Int(x, y));
        }
    }

    return output;
}

Как также прокомментировано в коде:
Обратите внимание, что это предполагает, что строка всегда идет строго слева направо. => Нет рисования вперед и назад, без горизонтального рисования.

Для них вы можете добавить некоторые дополнительные проверки, такие как if(dif.x < 0), тогда вам нужно будет выполнить итерацию в другом направлении for (var x = -1; x > dif.x ; x--). И если это if(dif.x == 0), вы, возможно, захотите нарисовать только горизонтальную линию до следующей точки, заполняя все сверху / снизу.

Для получения лучших результатов вы можете изучить алгоритмы рисования линий и реализовать другой способ получения и заливки пикселей по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...