在Windows窗体上指定点/位置的更准确的方法

本文关键字:位置 方法 窗体 Windows | 更新日期: 2023-09-27 18:02:13

我试图在窗体的中心围绕圆圈移动一个图片框。我有一个问题,准确地描绘在哪里的图片框应该出现由于四舍五入的问题。我的数据的一个子集可能反映如下:

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.

在Windows窗体上指定点/位置的更准确的方法

首先,通过将双精度类型转换为整型,您将自动截断其值。像23.999这样的数字会自动被截断为23,而实际上它更接近24。最好四舍五入到最接近的整数,而不是截断。

其次,屏幕上的像素以离散的步骤出现,这是无法回避的事实。屏幕位置不是连续的,因此不能真正显示十进制值。但是,您可以通过使用抗混叠技术来更好地近似十进制值。在这种技术中,你可以画两个或更多的点,它们彼此相邻,大小不同,代表一个点。例如,我可能将数字36.75绘制为位置36的较强像素和位置35的较弱像素。由此产生的效果是一个"点",似乎介于位置35和36之间,但更接近36。谷歌反锯齿获取更多信息。

您可以尝试使用PointF,它接受浮点数。

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

您需要更高精度的库。c#双精度类型只有15-16位的精度。我推荐下载W3b。