Kanako's Programming



  

正N角形を描くプログラム(N=5,9)(C#のソース)





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

     class nonagondata : Form{
         public static void Main(){
                Application.EnableVisualStyles();
                Application.Run(new nonagondata());
         }
        
         private Point[] p;
         private Dictionary<int,string[]> solddic;
         private Dictionary<int,string[]> brokendic;
         private Dictionary<int,string[]> daubdic;

         public nonagondata(){
                p = new Point[47];

        	FileStream data = new FileStream("pentagondata.txt",FileMode.Open);
        	StreamReader r = new StreamReader(data);
        	string P_data;
        	DataTable dt = new DataTable();
        	while((P_data = r.ReadLine()) != null){
                	string[] arr = P_data.Split(',');
                 	string arr1 = String.Copy(arr[1]);
                 	string arr2 = String.Copy(arr[2]);

                 	arr1 = conv_math(arr1);
                 	arr1 = conv_x(arr1);
                 	Object arr3 = dt.Compute(arr1,"");

                 	arr2 = conv_math(arr2);
                 	arr2 = conv_x(arr2);
                	Object arr4 = dt.Compute(arr2,"");

                 	p[int.Parse(arr[0])] = new Point(Convert.ToInt32(arr3),400-Convert.ToInt32(arr4));
        	}
        	FileStream solddata = new FileStream("pentagondata-sold.txt",FileMode.Open);
        	StreamReader soldr = new StreamReader(solddata);
        	string Sold_data;
        	solddic = new Dictionary<int,string[]>();
       	 	while((Sold_data = soldr.ReadLine())!=null){
              		string[] arrsold = Sold_data.Split(',');
              		int firsts = int.Parse(arrsold[0]);
              		Array.Clear(arrsold,0,1);
              		solddic.Add(firsts,arrsold);
        	}
       		FileStream brokendata = new FileStream("pentagondata-broken.txt",FileMode.Open);
       		StreamReader brokenr = new StreamReader(brokendata);
       		string broken_data;
       		brokendic = new Dictionary<int,string[]>();
       		while((broken_data = brokenr.ReadLine())!=null){
              		string[] arrbroken = broken_data.Split(',');
              		int firstb = int.Parse(arrbroken[0]);
              		Array.Clear(arrbroken,0,1);
              		brokendic.Add(firstb,arrbroken);
              	}
      		FileStream daubdata = new FileStream("pentagondata-daub.txt",FileMode.Open);
       		StreamReader daubr = new StreamReader(daubdata);
       		string daub_data;
       		daubdic = new Dictionary<int,string[]>();
       		while((daub_data = daubr.ReadLine())!=null){
              		string[] arrdaub = daub_data.Split(',');
              		int firstd = int.Parse(arrdaub[0]);
              		Array.Clear(arrdaub,0,1);
              		daubdic.Add(firstd,arrdaub);
              	}
          	Paint += new PaintEventHandler(nonagondata_Paint);
     	}
     
     	static string conv_math(string xy){
            Regex regex = new Regex(@"Math.Sqrt\(([0-9]+)\)");
            var mat = new Regex(@"Math.Sqrt\(([0-9]+)\)");
            if (regex.IsMatch(xy)){
                  for (Match m = regex.Match(xy); m.Success; m =
                            m.NextMatch()){
                           int x2 = int.Parse(m.Groups[1].Value);
                           double x1 = Math.Sqrt(x2);
                           xy = xy.Replace(m.Value,x1.ToString());
                  }
            }
            return xy;
     	}
 
     	static string conv_x(string xy){
            Regex regex = new Regex(@"(sin|cos|tan)\([0-9]{1,3}\)");
            if (regex.IsMatch(xy)){
                  for (Match m = regex.Match(xy); m.Success; m = m.NextMatch()){
                        string math = m.Value;
                        string value = Regex.Replace(math,@"[^\d]","");
                        if(math.Contains("tan")){
                          	double num1 = double.Parse(value);
                          	double num2 = Math.Tan(Math.PI/180*num1);
                          	xy = xy.Replace(m.Value,num2.ToString());
                   	}else if(math.Contains("cos")){
                          	double num1 = double.Parse(value);
                          	double num2 = Math.Cos(Math.PI/180*num1);
                          	xy = xy.Replace(m.Value,num2.ToString());
                   	}else if(math.Contains("sin")){
                          	double num1 = double.Parse(value);
                          	double num2 = Math.Sin(Math.PI/180*num1);
                          	xy = xy.Replace(m.Value,num2.ToString());
                   	}
            	  }
    	     }
    	     return xy;
	}

	void nonagondata_Paint(object sender,PaintEventArgs e){
     		this.Size = new Size(500,500);
     		int time = 500;
     		Pen blackPen = new Pen (Color.Black,5);
     		SolidBrush Yellow = new SolidBrush(Color.Yellow);
     		Pen RedPen = new Pen(Color.Red,3);
     		RedPen.DashStyle = DashStyle.DashDot;

     		Graphics g = this.CreateGraphics();

     		for (int i=0; i<solddic.Count; ++i){
             		g.Clear(Color.White);
             		if(!(brokendic[i][1]).Equals("N")){
                  		for (int bj=1; bj<brokendic[i].Length-1; bj=bj+2){
                       			int bx = int.Parse(brokendic[i][bj]);
                       			int by = int.Parse(brokendic[i][bj+1]);
                       			g.DrawLine(RedPen,p[bx],p[by]);
                  		}
             		}
             		for(int sj=1;sj<solddic[i].Length-1; sj=sj+2){
                 		int sx = int.Parse(solddic[i][sj]);
                 		int sy = int.Parse(solddic[i][sj+1]);
                 		g.DrawLine(blackPen,p[sx],p[sy]);
            		}
             		if(!(daubdic[i][1]).Equals("N")){
                  		Point[] dpoints = new Point[daubdic[i].Length];
                  		for (int dj=1; dj<daubdic[i].Length; ++dj){
                            		int d = int.Parse(daubdic[i][dj]);
                            		dpoints[dj] = new Point(p[d].X,p[d].Y);
                  		}
                  		g.FillPolygon(Yellow,dpoints,FillMode.Winding);
             		}
             		System.Threading.Thread.Sleep(time);
       		}
       		blackPen.Dispose();
      		RedPen.Dispose();
      		Yellow.Dispose();
       		Application.Exit();
 	}               
}

BACK(Kanako Suto's Pageへ)
このページへの質問・コメントを歓迎致します。