У нас есть приложение, написанное на C++ 6, которое заполняет пустые полигоны на карте трафика, чтобы показать текущие условия движения. Зеленый — хорошо, желтый — больше загруженности и т. д.
«Карты-оболочки» — это растровые изображения дорог с использованием прямоугольников и многоугольников, которые ничем не заполнены. Данные собираются с дорожных датчиков (проволочные индукторные петли), а полигоны заполняются на основе данных петлевого детектора.
Когда карты изменяются, кто-то должен вручную увеличить растровое изображение в Paint и получить координаты внутри каждой новой формы, где будет заполнен цвет скопления. Многоугольники, составляющие скелет карты, нарисованы темно-синим цветом. , на белом фоне.
Я сделал приложение. где, когда пользователь щелкает в любом месте внутри белой части многоугольника, точки внутреннего периметра отображаются пользователю с увеличенным эскизом, показывающим нарисованный внутренний разрешитель.
В .Net периметр прокрашивается идеально.
В приложении C++ 6 некоторые многоугольники указывают на мое приложение. сборы отображаются неправильно.
Я посмотрел на msPaint, и .Net не рисует точки так же, как MS Paint.
Вот быстрый пример. Код из одной формы с одной кнопкой и одной меткой. Линия рисуется на растровом изображении, растровое изображение «увеличивается», чтобы вы могли его видеть, и отображается на этикетке.
Нарисованный сегмент линии не совпадает с сегментом линии, который вы рисуете в MS Paint, если вы рисуете линию в Paint, используя те же две точки.
private void button1_Click(object sender, EventArgs e)
{
Bitmap bm = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(bm);
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Default;
Point pt = new Point(1, 3);
Point pt2 = new Point(5, 1);
// If you reverse the points, the same line is drawn.
g.DrawLine(Pens.Orange, pt, pt2);
// label1.Image = bm;
Bitmap bm2 = ZoomMap(8, bm);
g.Dispose();
bm.Dispose();
label1.Image = bm2;
}
private Bitmap ZoomMap(int zoomValue, Bitmap bm)
{
Bitmap zoomedBitMap;
Size sz = bm.Size;// new Size(75, 75);
Size newSize = new Size(sz.Width * zoomValue, sz.Height * zoomValue);
zoomedBitMap = new Bitmap(newSize.Width, newSize.Height);
Graphics gr = Graphics.FromImage(zoomedBitMap);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
gr.PageUnit = GraphicsUnit.Pixel;
gr.DrawImage(bm, 1, 1, newSize.Width, newSize.Height);
gr.Dispose();
return zoomedBitMap;
}
Независимо от того, какие настройки я применяю, невозможно имитировать MS Paint в C#, но в C++ 6 он отлично имитирует MS Paint.
Есть ли какой-либо тип API Windows, который я могу вызвать для рисования на существующем растровом изображении?
Заранее спасибо за любые ответы.