using PaintDotNet.Annotation.Enum;
using PaintDotNet.Base.CommTool;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace PaintDotNet.Annotation.FieldView
{
///
/// 矩形视场绘制
///
public class ViewRectangleEx : ViewBase
{
public override void SetK()
{
K = (double)(Points[1].Y - Points[0].Y) / (Points[1].X - Points[0].X);
}
#region Constructor
public ViewRectangleEx()
{
objectType = DrawClass.View;
drawToolType = DrawToolType.ViewRectangleEx;
Rotatable = true;
Initialize();
}
public ViewRectangleEx(Point p) : this()
{
for (int i = 0; i < 4; i++) AddPoint(p);
}
public ViewRectangleEx(List points) : this()
{
Points = points;
SetK();
}
#endregion
///
/// 帮助创建任意四边形视场
///
///
public void CreatStep(Point point, int step)
{
switch (step)
{
case 1:
Points[1] = point;
Points[2] = point;
SetK();
break;
case 2:
MoveCorner(point, 2);
break;
}
OnPropertyChanged();
}
#region Handle
public override int HandleCount => 9;
public override PointF GetHandle(int i)
{
if (i == 9)
{
var x = GetHandle(2).X + GetHandle(3).X;
var y = GetHandle(2).Y + GetHandle(3).Y;
x = (float)((x / 2));
y = (float)((y / 2));
return new PointF(x, y);
}
else
{
var count = Points.Count;
var x = Points[(i / 2) % count].X + Points[(i - 1) / 2].X;
var y = Points[(i / 2) % count].Y + Points[(i - 1) / 2].Y;
return new PointF(x / 2, y / 2);
}
}
public override Cursor GetHandleCursor(int handleNumber)
{
if (handleNumber == 9)
return m_rotateCursor;
else
return m_resizeCursor;
}
public override void MoveHandleTo(Point point, int handleNumber)
{
if (handleNumber == 9)
MoveRotate(point);
else if (handleNumber % 2 == 0)
MoveEdge(point, handleNumber / 2 - 1);
else
MoveCorner(point, handleNumber / 2);
OnPropertyChanged();
}
private void MoveCorner(Point point, int i)
{
this.Points[i] = point;
if (i % 2 == 0)
{
this.Points[(i + 3) % 4] = BasicCalculationHelper.GetDropFeet(this.Points[(i + 2) % 4], K, point);
this.Points[(i + 1) % 4] = BasicCalculationHelper.GetDropFeet(this.Points[(i + 2) % 4], -1 / K, point);
}
else
{
this.Points[(i + 1) % 4] = BasicCalculationHelper.GetDropFeet(this.Points[(i + 2) % 4], K, point);
this.Points[(i + 3) % 4] = BasicCalculationHelper.GetDropFeet(this.Points[(i + 2) % 4], -1 / K, point);
}
}
private void MoveEdge(Point point, int i)
{
var tempk = i % 2 != 0 ? K : -1 / K;
this.Points[i] = BasicCalculationHelper.GetDropFeet(Points[(i + 3) % 4], tempk, point);
this.Points[(i + 1) % 4] = BasicCalculationHelper.GetDropFeet(Points[(i + 2) % 4], tempk, point);
}
#endregion
#region Clone
public override DrawObject Clone()
{
return Clone(ISurfaceBox);
}
///
/// Clone this instance
///
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
ViewRectangleEx drawRectangle = new ViewRectangleEx(Points);
drawRectangle.ISurfaceBox = surfaceBox;
drawRectangle.combineMode = this.combineMode;
drawRectangle.Color = Color;
drawRectangle.ID = ID;
FillDrawObjectFields(drawRectangle);
return drawRectangle;
}
#endregion
}
}