Более точный способ указать точку / местоположение в форме Windows? - PullRequest
0 голосов
/ 13 июля 2011

Я пытаюсь переместить графическое поле вокруг круга в центре моей формы. У меня проблема с точным отображением места появления графического блока из-за проблем с округлением. Подмножество моих данных может отражать следующее:

109.023696905025,151.715396359085
109.041149311463,152.715244054241
109.0586017179,153.715091749398
109.076054124337,154.714939444554
109.093506530774,155.714787139711
109.110958937212,156.714634834867
109.128411343649,157.714482530023
109.145863750086,158.71433022518

Поле Location элемента управления принимает только Point, которое усекает мои точки после запятой, в результате чего при рисовании получается гексагональная форма. Я использую следующий блок кода для создания моих координат:

 double x1 = pictureBox1.Location.X;
 double y1 = pictureBox1.Location.Y;

 double cx = (double)this.Width / 2;
 double cy = (double)this.Height / 2;
 double radius = Math.Sqrt(Math.Pow(cx - x1, 2) + Math.Pow(cy - y1, 2));

 double arc = Math.Atan((y1 - cy) / (x1 - cx));
 double x = cx + radius * Math.Cos(arc + Math.PI - (Math.PI / 180.0));
 double y = cy + radius * Math.Sin(arc + Math.PI - (Math.PI / 180.0));

Учитывая неточность при создании объекта Point, а также x и y, представляющие мои точки, как я могу точно нарисовать точки, сгенерированные моим кодом, чтобы быть более точными?

 Console.WriteLine("{0},{1}",x, y);
 pictureBox1.Location = new Point((int)x, (int)y); // Only takes integers, which results in the irregular path.

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Прежде всего, если ввести двойные числа как int, вы автоматически усекаете их значения.Число, например 23,999, будет автоматически обрезано до 23, если на самом деле оно ближе к 24. Лучше было бы округлить до ближайшего целого, а не урезать.

Во-вторых, нет никакого способа обойти тот факт, что пикселина экране происходят дискретными шагами.Расположение экранов не является непрерывным и поэтому не может отображать десятичное значение.Тем не менее, вы можете лучше приблизиться к десятичному значению, используя технику сглаживания.В такой технике вы можете нарисовать две или более точек рядом друг с другом с разными величинами, которые должны представлять одну точку.Например, я мог бы построить число 36,75 как более сильный пиксель в местоположении 36 с более слабым пикселем в местоположении 35. В результате получается «точка», которая выглядит где-то между местоположением 35 и 36, но ближе к 36. Google для анти-смазывание, чтобы получить больше информации.

2 голосов
/ 13 июля 2011

Вы можете попробовать использовать PointF, который принимает числа с плавающей точкой.

http://msdn.microsoft.com/en-us/library/system.drawing.pointf.aspx

0 голосов
/ 13 июля 2011

Вам нужна библиотека с более высокой точностью. Двойной тип C # имеет точность только 15-16 цифр. Я рекомендую скачать W3b.Sine , который предложит вам больше точности.

...