※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ちょっとしたことを考えてC#で作っている正三角形ボタン。
PictureBox4に描かれた正三角形をクリックしたとき正三角形の各辺からの距離の比を表示するプログラム。
数学の勉強解説サイトや、おもちゃの画像ソフトに使う予定、というか使えたらいいなあ。


PicturBox1~4までをFormに貼り付けてあり、PictureBox4のクリックイベントにはMouseDownを設定。
PictureBo3をクリックするとPictureBox4に三角形が描かれるのでPictureBox4をクリックしてみましょう。

クリックした地点の、三角形の各辺までの距離が表示されます。


最終目標

この三角形ボタン色々な使い方があると思いますが一番分かりやすいのは例えばこんな使い方。

見下ろし型RTSゲームの各ユニットの行動モードを一覧で表示しています。


想像してみてください。
ユニットに命令を出すRTSの操作中、こんなボタンが現れて多数のユニットの行動パタンを一度に命令出来たりしたら、ちょっと楽しそうでしょ?
画面をクリックして顔の位置を変えれば、キャラの行動パターンが変わるわけです。

一つの画面でたくさんのユニットの行動パターンを設定できる画面となります。
どう使えばいいかは熟考中ですが、一覧性の高いユニット命令一覧画面でてばやくコマンドが終わるというのはとても楽しそうなアイディアです。




現状

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace WindowsFormsApplication3
{
   public partial class Form1 : Form
   {
       double a = 50;
       double r =300;
       double root3 = Math.Sqrt(3); 

       public Form1()
       {
           InitializeComponent();
       }
      private void pictureBox4_MouseDown(object sender, MouseEventArgs e)
       {
          double pX = e.X-a/2;
          double pY = -e.Y + root3 / 2.0 * r+a/2;
          double tPH1 = pY; 
          double tPH2 =(root3 * r - root3 * pX - pY) / 2.0; 
          double tPH3 =root3/2.0*pX-pY/2.0;
          MessageBox.Show(tPH1.ToString() +" "+ tPH2.ToString() +" "+ tPH3.ToString()   );

      }

       private void pictureBox3_Click(object sender, EventArgs e)
       {
             //画像ファイルはテスト用、コードご利用時は自分のファイルをお使いください。
           pictureBox1.Image =new Bitmap( "D:/色々/中高生向け戦争小説 ギガンダム討伐/futta1385m.jpg");
           pictureBox2.Image =new Bitmap( "D:/色々/中高生向け戦争小説 ギガンダム討伐/自分で作ったフィルタサンプル2.png");
           pictureBox3.Image = new Bitmap("D:/色々/中高生向け戦争小説 ギガンダム討伐/sina_enki03.jpg");
           //Bitmap b1 = new Bitmap(100, 100, "GIF");006fastthumbnail/fastthumbnail.html サムネイル画像の取り扱い方法
          

           Bitmap  b1 =new Bitmap(pictureBox1.Image.GetThumbnailImage((int)a,(int)a, delegate { return false; }, IntPtr.Zero));
           Bitmap  b2 =new Bitmap(pictureBox2.Image.GetThumbnailImage((int)a,(int)a, delegate { return false; }, IntPtr.Zero));
           Bitmap  b3 =new Bitmap(pictureBox3.Image.GetThumbnailImage((int)a,(int)a, delegate { return false; }, IntPtr.Zero));
           Bitmap  bAns=new Bitmap ((int)(2*a+r) ,(int)(2*a+root3*r/2));//後でサイズを変える
            

           for (int i = 0; i < bAns.Width; i++)
           {
               for (int j = 0; j < bAns.Height; j++)
               {
                   bAns.SetPixel(i,j,Color.White);
               }
           }

           Graphics  g=Graphics.FromImage(bAns);
           Point p1=new Point((int)((r+a)/2),  (int)(a/2.0));
           Point p2=new Point((int)(a / 2  ),  (int)(root3/2.0*r+a/2.0));
           Point p3=new Point((int)(a / 2+r),  (int)(root3 / 2.0 * r + a / 2.0));
           Point[] Point={p1,p2,p3,p1};
           SolidBrush blueBrush = new SolidBrush(Color.Blue);

           g.FillPolygon(blueBrush,Point); 

           for (int i = 0; i < b1.Width; i++)
           {
               for (int j = 0; j < b1.Height ; j++)
               {
                   bAns.SetPixel((int)(i+r/2   ),(int)(j              )    ,b1.GetPixel(i, j));
                   bAns.SetPixel((int)(i       ),(int)(j + root3/2.0*r)    ,b2.GetPixel(i, j));
                   bAns.SetPixel((int)(i + r   ),(int)(j + root3/2.0*r)    ,b3.GetPixel(i, j)); 
               }
           }
           
           pictureBox4.Image = bAns;  


           //Bitmap(Int32, Int32, Graphics) 指定したサイズと指定した Graphics オブジェクトの解像度を使用して、Bitmap クラスの新しいインスタンスを初期化します。  

       }

       private void pictureBox4_Click(object sender, EventArgs e)
       {

       }


   }
}