Извлечение координат точек (x, y) из кривой c # - PullRequest
0 голосов
/ 21 сентября 2018

у меня есть кривая, которую я рисую на картинке в c # с использованием метода graphics.drawcurve (ручка, точки, натяжение)

есть ли в любом случае, что я могу извлечь все точки (координаты x, y) былипокрыты кривой?и сохранить их в массив или список, или что-то еще было бы здорово, поэтому я могу использовать их в разных вещах.

Мой код:

void Curved()
{
    Graphics gg = pictureBox1.CreateGraphics();
    Pen pp = new Pen(Color.Green, 1);
    int i,j;
    Point[] pointss = new Point[counter];

    for (i = 0; i < counter; i++)
    {
        pointss[i].X = Convert.ToInt32(arrayx[i]);
        pointss[i].Y = Convert.ToInt32(arrayy[i]);
    }
    gg.DrawCurve(pp, pointss, 1.0F);
}

Большое спасибо заранее.

1 Ответ

0 голосов
/ 21 сентября 2018

Если вам действительно нужен список координат пикселей, вы все равно можете позволить GDI + выполнять тяжелую работу:

using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace so_pointsfromcurve
{
    class Program
    {
        static void Main(string[] args)
        {
            /* some test data */
            var pointss = new Point[]
            {
                new Point(5,20),
                new Point(17,63),
                new Point(2,9)
            };
            /* instead of to the picture box, draw to a path */
            using (var path = new GraphicsPath())
            {
                path.AddCurve(pointss, 1.0F);
                /* use a unit matrix to get points per pixel */
                using (var mx = new Matrix(1, 0, 0, 1, 0, 0))
                {                    
                    path.Flatten(mx, 0.1f);
                }
                /* store points in a list */
                var list_of_points = new List<PointF>(path.PathPoints);
                /* show them */
                int i = 0;
                foreach(var point in list_of_points)
                {
                    Debug.WriteLine($"Point #{ ++i }: X={ point.X }, Y={point.Y}");
                }
            }

        }
    }
}

Этот подход рисует сплайн на пути, а затем использует встроенную возможностьсглаживания этого пути к достаточно плотному набору сегментов линии (как это делают большинство программ векторного рисования), а затем выделение точек пути из сетки линий в список PointF s.

.артефакты рендеринга устройства GDI + (сглаживание, сглаживание) в этом процессе теряются.

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