|
分類:[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;
}
}
}
}
|