我正试图在我的表格中心的圆圈周围移动一个图片框。我有一个问题,准确描述由于四舍五入问题图片框应该出现在哪里。我的数据的一个子集可能反映以下内容:
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.
答案 0 :(得分:2)
您可以尝试使用PointF,它接受浮动。
http://msdn.microsoft.com/en-us/library/system.drawing.pointf.aspx
答案 1 :(得分:2)
首先,通过将双精度类型转换为int,您将自动截断它们的值。像23.999这样的数字将自动被截断为23,而实际上它更接近24.最好舍入到最接近的整数而不是截断。
其次,没有办法解决屏幕上的像素以不连续的步骤发生的事实。屏幕位置不连续,因此无法真正显示小数值。但是,您可以通过使用抗锯齿技术更好地近似十进制值。在这种技术中,您可以以不同的幅度绘制两个或多个彼此相邻的点,这些点代表一个点。例如,我可能将数字36.75绘制为位置36处的较强像素,位置35处的像素较弱。所产生的效果是“点”,似乎位于位置35和36之间但接近36处。 - 获得更多信息。
答案 2 :(得分:0)
您需要更高精度的库。 C# double type只有15-16位精度。我建议下载W3b.Sine,这样可以提供更高的精确度。