-2

フォームの中心にある円の周りに画像ボックスを移動しようとしています。丸めの問題により、画像ボックスが表示される場所を正確に表す問題が発生しています。私のデータのサブセットは、次のことを反映している可能性があります。

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.
4

3 に答える 3

2

float を受け入れる PointF を使用してみてください。

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

于 2011-07-13T18:05:10.060 に答える
2

まず、double を int として型キャストすることにより、それらの値を自動的に切り捨てます。23.999 のような数値は、実際には 24 に近い場合でも、自動的に 23 に切り捨てられます。切り捨てるのではなく、最も近い整数に丸める方がよいでしょう。

第 2 に、画面上のピクセルが個別のステップで発生するという事実を回避する方法はありません。画面の位置は連続していないため、10 進数の値を正確に表示することはできません。ただし、アンチエイリアシング手法を使用すると、10 進数値をより適切に近似できます。このような手法では、大きさの異なる 2 つ以上の点を隣り合わせに描画して、1 つの点を表すことができます。たとえば、36.75 という数値を、位置 36 の強いピクセルと位置 35 の弱いピクセルとしてプロットするとします。結果の効果は、位置 35 と 36 の間のどこかにあるように見えますが、36 に近いように見える「ポイント」です。 -より多くの情報を取得するためのエイリアシング。

于 2011-07-13T18:05:17.533 に答える
0

より精度の高いライブラリが必要です。C#の double 型の精度は 15 ~ 16 桁のみです。より精度の高いW3b.Sineをダウンロードすることをお勧めします。

于 2011-07-13T18:06:25.177 に答える