C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: e.Graphics.DrawLine を平行移動


(過去ログ 130 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■76897 / inTopicNo.1)   e.Graphics.DrawLine を平行移動
  
□投稿者/ ゆーきゃん (38回)-(2015/08/27(Thu) 11:50:07)

分類:[C#] 

いつもお世話になっております。
質問宜しいでしょうか?

以下の図を見て頂いてもよろしいでしょうか?


・------・------・     ・  /  ・    ・         ・   ・   ・
|       |        /    \                       
|       |      /      \                        
|       |     /        \           /\             
|       |    \         \        /  \              
・   ・   ・ →   ・      ●   ・        →   / ・  \・   ・               
|       |      \          \    /      \            
|       |       \        /    \        \              
|       |        \     /      \        \         
|       |         \   /        \        \          
・------・------・     ・   ・\ /・          ・   ・  / ●                   
                                                                 \        /
                                                                   \    /
                                                                     \/
                       
  通常の状態          45度回転          ポイントを合わせて平行移動


e.Graphics.DrawLine で、長方形を書いたとします。
真ん中の中心点を基準に45度回転させます。
その後。右下の点を基準に回転した長方形を平行移動する。
これと同様な設定を各9点に施したいのですが、スマートに行う方法などありますでしょうか?


以下現在のプログラムとなります。
この中のcase 0~8 の中の計算式(x0,y0,x1,y1)をまとめたいとの思いから、この質問をさせて頂きました。
どなたかご指導ご鞭撻の程よろしくお願い致します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.Drawing.Drawing2D;
////////////////////////////////////////////////////
namespace kaiten
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        double radian = Math.PI / 180; // sin/cos値を求める変数
        
        float zahyou_x = 250;
        float zahyou_y = 250;
        int kijyun = 0; // 0=真ん中、1=上、2=下、3=左、4=右、5=左上、6=右上、7=左下、8=右下
        char katati = 'H'; 
        float size_1 = 200;
        float size_2 = 100;
        float angle = 45;

        float x0;
        float x1;
        float y0;
        float y1;


        public void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {

            e.Graphics.ScaleTransform(1, -1);   //Y軸方向の反転
            e.Graphics.TranslateTransform(0, -500); //座標原点を(x1,y1)に移動

            e.Graphics.DrawEllipse(Pens.White, zahyou_x, zahyou_y, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x, zahyou_y + size_1 / 2, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x, zahyou_y - size_1 / 2, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x - size_2 / 2, zahyou_y, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x + size_2 / 2, zahyou_y, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x - size_2 / 2, zahyou_y + size_1 / 2, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x + size_2 / 2, zahyou_y + size_1 / 2, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x - size_2 / 2, zahyou_y - size_1 / 2, 1, 1);
            e.Graphics.DrawEllipse(Pens.White, zahyou_x + size_2 / 2, zahyou_y - size_1 / 2, 1, 1);

            switch (katati)
            {
                case 'H':

                    switch (kijyun)
                    {
                        case 0: // 真ん中

                            // 基準点(原点)に移動
                            e.Graphics.TranslateTransform(zahyou_x, zahyou_y); 


                            // ポイントとなるx・y座標を計算
                            x0 = -size_2 / 2;
                            x1 = x0 * -1;
                            y0 = size_1 / 2;
                            y1 = y0 * -1;


                            break;

                        case 1: // 上

                            e.Graphics.TranslateTransform(zahyou_x, zahyou_y + size_1 / 2); 

                            // ポイントとなるx・y座標を計算
                            x0 = -size_2 / 2;
                            x1 = x0 * -1;
                            y0 = 0;
                            y1 = -size_1;



                            break;

                        case 2: // 下

                            e.Graphics.TranslateTransform(zahyou_x, zahyou_y - size_1 / 2); 

                            // ポイントとなるx・y座標を計算
                            x0 = -size_2 / 2;
                            x1 = x0 * -1;
                            y0 = size_1;
                            y1 = 0;


                            break;

                        case 3: // 左

                            e.Graphics.TranslateTransform(zahyou_x - size_2 / 2, zahyou_y); 

                            // ポイントとなるx・y座標を計算
                            x0 = 0;
                            x1 = size_2;
                            y0 = size_1 / 2;
                            y1 = y0 * -1;


                            break;

                        case 4: // 右

                            e.Graphics.TranslateTransform(zahyou_x + size_2 / 2, zahyou_y); 

                            // ポイントとなるx・y座標を計算
                            x0 = -size_2;
                            x1 = 0;
                            y0 = size_1 / 2;
                            y1 = y0 * -1;


                            break;

                        case 5: // 左上

                            e.Graphics.TranslateTransform(zahyou_x - size_2 / 2, zahyou_y + size_1 / 2); 

                            // ポイントとなるx・y座標を計算
                            x0 = 0;
                            x1 = size_2;
                            y0 = 0;
                            y1 = -size_1;


                            break;

                        case 6: // 右上

                            e.Graphics.TranslateTransform(zahyou_x + size_2 / 2, zahyou_y + size_1 / 2); 

                            // ポイントとなるx・y座標を計算
                            x0 = -size_2;
                            x1 = 0;
                            y0 = 0;
                            y1 = -size_1;

                            break;

                        case 7: // 左下

                            e.Graphics.TranslateTransform((int)zahyou_x - size_2 / 2, (int)zahyou_y - size_1 / 2); 

                            // ポイントとなるx・y座標を計算
                            x0 = 0;
                            x1 = size_2;
                            y0 = size_1;
                            y1 = 0;


                            break;



                        case 8: // 右下

                            e.Graphics.TranslateTransform((int)zahyou_x + size_2 / 2, (int)zahyou_y - size_1 / 2); 

                            x0 = -size_2;
                            x1 = 0;
                            y0 = size_1;
                            y1 = 0;


                            break;
                    }

                         
                    //                                   0   1   2   3  
                    float[] h_x_before = new float[4] { x0, x1, x0, x1  };
                    float[] h_y_before = new float[4] { y0, y0, y1, y1  };

                    float[] h_x_after = new float[4];
                    float[] h_y_after = new float[4];

                    PointF[] h_point = new PointF[4];



                    // 回転操作 ※ 
                    for (int i = 0; i < 4; i++)
                    {
                        h_x_after[i] = h_x_before[i] * (float)Math.Cos(angle * radian) - h_y_before[i] * (float)Math.Sin(angle * radian);
                        h_y_after[i] = h_x_before[i] * (float)Math.Sin(angle * radian) + h_y_before[i] * (float)Math.Cos(angle * radian);

                        h_point[i] = new PointF(h_x_after[i], h_y_after[i]); // 小数でも対応可能にするため
                    }


                    // ポイントを元に線を描写
                    e.Graphics.DrawLine(Pens.Green, h_point[0], h_point[1]);
                    e.Graphics.DrawLine(Pens.Green, h_point[0], h_point[2]);
                    e.Graphics.DrawLine(Pens.Green, h_point[1], h_point[3]);
                    e.Graphics.DrawLine(Pens.Green, h_point[2], h_point[3]);



                    break;


            }


        }
    }
}

引用返信 編集キー/
■76913 / inTopicNo.2)  Re[1]: e.Graphics.DrawLine を平行移動
□投稿者/ ゆーきゃん (39回)-(2015/08/27(Thu) 17:25:24)
自己解決しました。
お手数おかけして申し訳ございませんでした。

※ 参照サイト(http://dobon.net/vb/dotnet/graphics/transform.html
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -