0

これまでに解決するのに 1 日以上かかっている問題について説明させてください。テキスト ファイルから一連の行を入力していて、それらを使って絵を描きたいと思っています。問題は、これらの線のうちの 2 つが近すぎる (1 ピクセルの距離) ことです。これは、Pen of Thickness is=1 を使用する場合に問題になります。以下の問題のある領域を参照してください。

ここに画像の説明を入力

参考までに、シェイプ全体を表すテキスト ファイル内の線の境界四角形は次のとおりです。

Rectangle(xmin, ymin, (xmax - xmin), (ymax - ymin)) =  761, 236, 298, 344

そして、それらをに描画しようとしてBitmap(20000, 15000)いますが、ビットマップのサイズは必要に応じて変更できます。

私の質問は次のとおりです。

  • このような重なりを避けるために、ペンの太さを 1 より小さくする回避策はありますか?
  • この問題が発生しないように、入力座標を少し変更 (ある種の「拡張」) することは可能でしょうか?

そうでなければ、誰かがこの問題を解決するための別の解決策を考えることができますか?

どうもありがとうございました、

私のコード:

using System;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;


namespace DrawingLinesTest
{
class Program
{

    static void Main(string[] args)
    {
        //Define the input txt file
        System.IO.StreamReader file = new System.IO.StreamReader("input.txt");
        //Define the bmp
        Bitmap bmp = new Bitmap(20000, 15000); 
        Graphics g = Graphics.FromImage(bmp);
        Pen blackPen = new Pen(Color.FromArgb(255, 0, 0, 0), 1);


        // Read the file
        int counter = 0;
        string line;
        var listX1 = new List<int>();
        var listY1 = new List<int>();
        var listX2 = new List<int>();
        var listY2 = new List<int>();
        var allPoints = new List<Point>();


        while ((line = file.ReadLine()) != null)
        {
            string[] points = line.Split(',');
            int x1 = int.Parse(points[0]), y1 = int.Parse(points[1]), x2 = int.Parse(points[2]), y2 = int.Parse(points[3]);
            int[] pInt = new int[4] { x1, y1, x2, y2 };
            listX1.Add(x1); listY1.Add(y1); listX2.Add(x2); listY2.Add(y2);

            Point a = new Point(int.Parse(points[0]), int.Parse(points[1]));
            Point b = new Point(int.Parse(points[2]), int.Parse(points[3]));               

            allPoints.Add(a); allPoints.Add(b);
            g.DrawLine(blackPen, a, b);                
            counter++;
        }
        file.Close();
        g.Dispose();
        //-----------------------------------------------------------------------------------------------------------------------------------------------
        // Find the list's bounding box.
        IEnumerable<Point> po = allPoints;
        Rectangle r = BoundingBox(po);
        Console.WriteLine(String.Format("Bounding Box {0},{1},{2},{3}", r.X, r.Y, r.Width, r.Height));

        Bitmap nb = new Bitmap(r.Width, r.Height);
        Graphics gr = Graphics.FromImage(nb);
        gr.DrawImage(bmp, -r.X, -r.Y);

        //Save input file as an image (output)
        nb.Save("outputPicture.png");
        //-----------------------------------------------------------------------------------------------------------------------------------------------

    }


    public static Rectangle BoundingBox(IEnumerable<Point> points)
    {
        var x_query = from Point p in points select p.X;
        int xmin = x_query.Min();
        int xmax = x_query.Max();

        var y_query = from Point p in points select p.Y;
        int ymin = y_query.Min();
        int ymax = y_query.Max();

        return new Rectangle(xmin, ymin, (xmax - xmin), (ymax - ymin));        }

}//end Program
}//end Namespace
4

1 に答える 1