Practical WPF Charts and Graphics Note_00

Practical WPF Charts and Graphics Note_00

关于向量:
在这里插入图片描述

输出结果:
在这里插入图片描述

(M11, M12, M21, M22, OffsetX, OffsetY)
默认构造函数值为: (1, 0, 0,1, 0, 0),
其代表变换矩阵(1,0;0,1;0,0),
实际上是矩阵(1,0,0;0,1,0;0,0,1)的简写形式
因为最后一列的值为(0;0;1)
在这里插入图片描述

关于小节Creating Perpendicular Lines代码理解注释

  1. 注意线段长度取值为界面设置值的一半:

double length = 0.5 * Convert.ToDouble(tbLength.Text);

  1. 关于文中向量表示:

Vector v1 = pt1 - pt2;
应为:
Vector v21 = pt1 - pt2;
例如:
Vector v12 = new Point(x2, y2) – new Point(x1, y1);

v21经过 v1.Normalize(); 归一化后:
在这里插入图片描述
Vector有四个公有属性:
在这里插入图片描述
归一化就是将LengthSquared的值转化为 : 1
比如:
Point pp1 = new Point(30, 40);
Point pp2 = new Point(3, 4);
Vector vc12 = pp2 - pp1;
vc12经归一化:vc12.Normalize(); 前后的值对比为:
在这里插入图片描述
v21经过 v1 *= length; 长度变换后:
在这里插入图片描述

pt3 = pt2 + new vector;

as we know :
pt1 = v21 + pt2
new vector = v21 * m1
the new point here pt3 of new vector comes from old point pt1, so:
pt3 = pt2 + v21 * m1;

即为下图中的代码:

pt3 = pt2 + v1 * m1;

在这里插入图片描述
3. pt4的计算类似,只是向量旋转方向相反。

在这里插入图片描述
4. 源代码风格有些凌乱和陈旧,代码经笔者整理并增加两条45度直线后如下:

namespace PerpendicularLine
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Line line1;
        private Line line2;
        private Line line3;
        private Line line4;

        public MainWindow()
        {
            InitializeComponent();

            Rectangle rect = new Rectangle
            {
                Stroke = Brushes.Black,
                Width = canvas1.Width,
                Height = canvas1.Height
            };
            canvas1.Children.Add(rect);

            AddLines();
        }

        private void AddLines()
        {
            Point pt1 = new Point();
            Point pt2 = new Point();

            double length = 0.5 * Convert.ToDouble(tbLength.Text);

            line1 = new Line
            {
                Stroke = Brushes.Pink,
                StrokeThickness = 4
            };

            pt1.X = Convert.ToDouble(tbX1.Text);
            pt1.Y = Convert.ToDouble(tbY1.Text);
            pt2.X = Convert.ToDouble(tbX2.Text);
            pt2.Y = Convert.ToDouble(tbY2.Text);

            line1.X1 = pt1.X;
            line1.Y1 = pt1.Y;
            line1.X2 = pt2.X;
            line1.Y2 = pt2.Y;

            canvas1.Children.Add(line1);

            Canvas.SetLeft(tbPoint1, pt1.X);
            Canvas.SetTop(tbPoint1, pt1.Y);
            Canvas.SetLeft(tbPoint2, pt2.X);
            Canvas.SetTop(tbPoint2, pt2.Y);
            tbPoint1.Text = "Pt1(" + pt1.ToString() + ")";
            tbPoint2.Text = "Pt2(" + pt2.ToString() + ")";

            Vector v21 = pt1 - pt2;
            v21.Normalize();
            v21 *= length;


            Matrix TempMatrix = new Matrix();
            TempMatrix.Rotate(-90);
            Point pt3 = pt2 + v21 * TempMatrix;

            TempMatrix = new Matrix();
            TempMatrix.Rotate(90);
            Point pt4 = pt2 + v21 * TempMatrix;

            TempMatrix = new Matrix();
            TempMatrix.Rotate(-45);
            Point pt23 = pt2 + v21 * TempMatrix;

            TempMatrix = new Matrix();
            TempMatrix.Rotate(45);
            Point pt24 = pt2 + v21 * TempMatrix;

            line3 = new Line
            {
                Stroke = Brushes.Green,
                X1 = pt2.X,
                Y1 = pt2.Y,
                X2 = pt23.X,
                Y2 = pt23.Y
            };

            line4 = new Line
            {
                Stroke = Brushes.Green,
                X1 = pt2.X,
                Y1 = pt2.Y,
                X2 = pt24.X,
                Y2 = pt24.Y
            };

            line2 = new Line
            {
                Stroke = Brushes.Green,
                StrokeThickness = 4,
                StrokeDashArray = DoubleCollection.Parse("3, 1"),

                X1 = pt3.X,
                Y1 = pt3.Y,
                X2 = pt4.X,
                Y2 = pt4.Y
            };

            canvas1.Children.Add(line2);
            canvas1.Children.Add(line3);
            canvas1.Children.Add(line4);

            Canvas.SetLeft(tbPoint3, pt3.X);
            Canvas.SetTop(tbPoint3, pt3.Y);
            Canvas.SetLeft(tbPoint4, pt4.X);
            Canvas.SetTop(tbPoint4, pt4.Y);
            pt3.X = Math.Round(pt3.X, 0);
            pt3.Y = Math.Round(pt3.Y, 0);
            pt4.X = Math.Round(pt4.X, 0);
            pt4.Y = Math.Round(pt4.Y, 0);
            tbPoint3.Text = "Pt3(" + pt3.ToString() + ")";
            tbPoint4.Text = "Pt4(" + pt4.ToString() + ")";
        }

        public void BtnApply_Click(object sender, EventArgs e)
        {
            if (line1 != null)
                canvas1.Children.Remove(line1);
            if (line2 != null)
                canvas1.Children.Remove(line2);
            if (line3 != null)
                canvas1.Children.Remove(line3);
            if (line4 != null)
                canvas1.Children.Remove(line4);
            AddLines();
        }
        public void BtnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}

运行结果如下:

在这里插入图片描述
(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

issta

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值