Silverlight画几何图形,显示中间过程(计算两个Point的距离,画虚线的方法)

在51aspx上找到一个非常酷的画几何图形的源码。可惜太复杂,看不懂。
干脆自己琢磨吧,先动态画条直线,画个圆,所谓动态就是指画直线或圆的时候,能显示中间过程。
同时学到了怎样计算两个点之间的距离,怎样画虚线。

ExpandedBlockStart.gif 大气象
< UserControl  x:Class ="DrawLine.DrawEclipse"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  
    Width
="400"  Height ="300" >
    
< Canvas  x:Name ="panel"  Background ="Black"  MouseMove ="panel_MouseMove"  MouseLeftButtonDown ="panel_MouseLeftButtonDown" >

    
</ Canvas >
</ UserControl >

 

ExpandedBlockStart.gif 大气象
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  DrawLine
{
    
public   partial   class  DrawEclipse : UserControl
    {
        
public  DrawEclipse()
        {
            InitializeComponent();
        }

        
private   bool  IsStart  =   true ; // 是否是起点。
         private   double  pX1  =   0 , pY1  =   0 ; // 起点坐标
         private   double  pX2  =   0 , pY2  =   0 ; // 终点坐标
        Ellipse ellipse  =   new  Ellipse(); // 画圆心
        Ellipse ellipseTmp  =   new  Ellipse(); // 画临时圆
        Line lineTmp  =   new  Line(); // 临时直线

        
private   void  panel_MouseLeftButtonDown( object  sender, MouseButtonEventArgs e)
        {
            Point p 
=  e.GetPosition(sender  as  FrameworkElement); // 取得鼠标点下的位置
            Canvas pnl  =  sender  as  Canvas;
            
if  (IsStart)
            {
                pX1 
=  p.X; // 设置起点坐标
                pY1  =  p.Y;
            }
            
else
            {
                pX2 
=  p.X; // 设置终点坐标
                pY2  =  p.Y;
            }
            
if  (IsStart) // 如果是起点,则画起点。
            {
                DrawPoint(pnl);
            }
            
else
            {
                DrawOneEclipse(pnl);
                
if  (lineTmp  !=   null )
                    pnl.Children.Remove(lineTmp);
            }
            IsStart 
=   ! IsStart;
        }
        
// 画圆
         private   void  DrawOneEclipse(Canvas pnl)
        {
            Ellipse ellipseOne 
=   new  Ellipse(); // 画圆
            ellipseOne.Stroke  =   new  SolidColorBrush(Color.FromArgb( 255 255 255 255 )); // 动态设置Stroke属性的方法。
            ellipseOne.StrokeThickness  =   2 ;
            
// 计算两点距离
            Point p1  =   new  Point(pX1, pY1);
            Point p2 
=   new  Point(pX2, pY2);
            
//
            var dx  =  p1.X  -  p2.X;
            var dy 
=  p1.Y  -  p2.Y;
            
double  distance  =  Math.Sqrt(dx  *  dx  +  dy  *  dy);

            ellipseOne.Width 
=  distance  *   2 ;
            ellipseOne.Height 
=  distance  *   2 ;

            Canvas.SetLeft(ellipseOne, pX1 
-  distance); // 动态设置Ellipse的Canvas.Top与Canvas.Left
            Canvas.SetTop(ellipseOne, pY1  -  distance);

            pnl.Children.Add(ellipseOne);
        }
        
// 画点
         private   void  DrawPoint(Canvas pnl)
        {
            ellipse.Stroke 
=   new  SolidColorBrush(Color.FromArgb( 255 255 255 255 )); // 动态设置Stroke属性的方法。
            ellipse.StrokeThickness  =   2 ;
            ellipse.Width 
=   4 ;
            ellipse.Height 
=   4 ;
            Canvas.SetLeft(ellipse, pX1);
// 动态设置Ellipse的Canvas.Top与Canvas.Left
            Canvas.SetTop(ellipse, pY1);

            pnl.Children.Add(ellipse);
        }
        
// 画临时圆
         private   void  DrawTmpEclipse(Canvas pnl)
        {
            
if  (ellipseTmp  !=   null )
                pnl.Children.Remove(ellipseTmp);
            ellipseTmp.Stroke 
=   new  SolidColorBrush(Color.FromArgb( 255 255 255 255 )); // 动态设置Stroke属性的方法。
            ellipseTmp.StrokeThickness  =   2 ;
            
// 计算两点距离
            Point p1  =   new  Point(pX1, pY1);
            Point p2 
=   new  Point(pX2, pY2);
            
//
            var dx  =  p1.X  -  p2.X;
            var dy 
=  p1.Y  -  p2.Y;
            
double  distance  =  Math.Sqrt(dx  *  dx  +  dy  *  dy);

            ellipseTmp.Width 
=  distance  *   2 ;
            ellipseTmp.Height 
=  distance  *   2 ;

            Canvas.SetLeft(ellipseTmp, pX1 
-  distance); // 动态设置Ellipse的Canvas.Top与Canvas.Left
            Canvas.SetTop(ellipseTmp, pY1  -  distance);

            pnl.Children.Add(ellipseTmp);

            pnl.Children.Remove(ellipse);
// 删除起点。
        }
        
// 画临时直线
         private   void  DrawTmpLine(Canvas pnl)
        {
            
if  (lineTmp  !=   null )
                pnl.Children.Remove(lineTmp);
            lineTmp.X1 
=  pX1;
            lineTmp.Y1 
=  pY1;
            lineTmp.X2 
=  pX2;
            lineTmp.Y2 
=  pY2;

            lineTmp.Stroke 
=   new  SolidColorBrush(Color.FromArgb( 255 255 255 255 ));
            lineTmp.StrokeThickness 
=   2 ;
            
// 设置虚线的方法
            DoubleCollection dc  =   new  DoubleCollection(){ 1 , 1 };
            lineTmp.StrokeDashArray 
=  dc;

            pnl.Children.Add(lineTmp);
        }

        
private   void  panel_MouseMove( object  sender, MouseEventArgs e)
        {
            Point p 
=  e.GetPosition(sender  as  FrameworkElement); // 取得鼠标点下的位置
            Canvas pnl  =  sender  as  Canvas;
            
if  ( ! IsStart) // 如果不是起点,则设置临时终点
            {
                pX2 
=  p.X; // 设置终点坐标
                pY2  =  p.Y;
                DrawTmpLine(pnl);
                DrawTmpEclipse(pnl);
            }
        }
    }
}

 本文源码:http://files.cnblogs.com/greatverve/DrawLineEclipse.rar

参考:http://51aspx.com/CV/SLGeometry/
这个源码酷多了。看看吧。

转载于:https://www.cnblogs.com/greatverve/archive/2010/10/08/silverlight-draw.html

项目描述: 该项目是一款计算机平面几何学的绘图工具。 内置了一些交互的样式库,供在线浏览。 项目使用Silverlight 2.0(可以使用Microsoft Expression v3 beta 转换成 silverlight v3.0) 以及 C#3.0进行开发(在silverlight 和 wpf 上各自实现了一个版本)。核心的绘图引擎具备了良好的灵活性和扩展性,方便开发人员添加新的图形和功能。 我们将面临的工作类型: 将已有的之前无法顺利迁移到web上的桌面应用程序(庞大交互复杂,有一定安全要求或者比较华丽总之就是Ajax无法胜任)使用Silverlight 3.0 技术迁移到web上。 对于一些良好的Flash应用的迁移。(这属于站坑拉屎,谁先占住坑的谁就是大爷) 对于现有AJAX应用进行更加丰富的扩展。 我们将面临的挑战: 开发WinForm程序的大爷们终于可以灵活的涉足于Web界而不需要搞令人沮丧到要无限次重构直到自己写http协议的Asp.net框架。他们来了。 欢迎Flex阵营的朋友投身的到Silverlight3.0 的圈子中,思路一致(不好听的说法叫抄袭)很好迁移,你们也来吧。 之所以能带来更加丰富的用户体验,是因为那纠葛交错的WinForm消息循环体系,任何的动作都可以轻易牵动应用全身,这远远区别于Web应用开发(因为很多时候我们选择--我刷我刷我刷刷刷)。我们的优势: XAML = html,XAML(资源文件) = CSS,C#(Ruby or Python even JS) = JS。 可见,你依然可以像开发web一样开发Silverlight应用只要大脑思路一转。 Silverlight 最终还是要放置在网站之上(我们首先不考虑Out of browser功能),所以熟悉HTML熟悉JS我们可以方便的让Silverlight与 HTML交互。 赘述到此,我想大家应该已经明白, 这款Silverlight 在线本版的平面几何图形图板便是经典的WinForm 到 Web的迁移。当你解读Silverlight代码和WPF代码的时候,你将会发现这并没有什么重大的不同之处(所以现在出现了Silverlight 和 WPF的兼容性类库,甚至出现了Silverlight 和 WPF的转换程序)。或者我们不妨悲剧的理解这本就是一个WebForm应用。我们带着强烈的愤怒怀疑这个微软的结构师本就是开发了10+年的WinForm(顺便仰慕一下)。 Main/SilverlightClient下为综合演示Demo,用VS2008打开后运行(或右键:在浏览器中打开)即可看到效果 自带了一些在线Demo,其他文件夹中还有些其他几何模型,有兴趣的可以自行研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值