@SergeySerge11

Откуда полосы при рисовании WPF SKIA?

Что вот это за полосы. Как от них избавится.
// печать клеточного поля
                                var rect = camera.GetRect(x, y);
                                canvas.DrawRect(rect, paintFill);
...............................
float offsetCells=0;
float sizeCellIner = CellSize  - offsetCells*2f;
 offsetCells=0;
for (int i = 0; i < rects.Length; i++)
{
    int y = Math.DivRem(i, сolumns, out int x);
    var r = new SKRect()
    {
        Location = new SKPoint((float)x * CellSize + offsetCells, (float)y * CellSize + offsetCells),
        Size = new SKSize(sizeCellIner, sizeCellIner)
    };
    rects[i] = r;
}

Вот к примеру код, Очевидно что соседние клетки должны начинается и заканчиваться на одинаковой ширине. rect[0].Right == rect[1].Left
Но часто они не совпадают там на чуть чуть, типа 3+2=4.9999999999999999999, может там проблема, но я не верю, что такая библиотека, типа берет и считает что 3+2=4.

К примеру если поставить параметр offsetCells=0.1f то начинают вот такие полосы, через примерно 20% размера экрана. То есть библиотека не отрисовывает линию длинной 0.1f через клетку, а отрисует через ~10 клеток, типа есть какой накопительный эффект.
А если поставить 0, то где-то на ширине экрана в 1000 пикселей при маленьком CellSize квадратов, появляется вот такая полоса одинарная. Если еще меньше CellSzie сделать, то 2 полосы, и тд.

В чем может быть проблема. И не раз с таким сталкивался, и не только в Skia, может это какая распространённая проблема.
65918d6559a19682273240.png
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
NikFaraday
@NikFaraday
Student full-stack Developer
Проблема, вероятно, связана с точностью представления чисел с плавающей запятой. Хотя математически 3 + 2 должно быть равно 5, при использовании чисел с плавающей запятой могут возникать небольшие ошибки округления из-за представления десятичных чисел в двоичной системе.

Это явление, когда небольшие ошибки в вычислениях с плавающей запятой накапливаются, известно как проблема потери точности. Она особенно заметна при выполнении множества операций с плавающей запятой или при итерациях.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы