Home | Course Index | << Prev | Next >> | PDF Version of this Page |
Course 2D_SL: 2D-Computer Graphics with Silverlight
|
||
Let me know what you think |
Preliminaries Page.XAML Page.xaml.cs Test |
Install 1) Visual Web Developer 2010 Express Edition English
and 2) Silverlight 4 Tools for Visual Studio 2010.
Guidance for Visual Web Developer 2010 Express: |
<UserControl x:Class="SL_draw1.Page" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel Orientation="Vertical"> <TextBlock x:Name="text_area" HorizontalAlignment="Center" VerticalAlignment="Top" FontFamily="Courier" FontSize="12"/> <Canvas x:Name="draw_area" Background="Cornsilk" Width="400" Height="400" MouseLeftButtonDown="OnMouseLeftButtonDown" MouseMove="OnMouseMove" MouseLeftButtonUp="OnMouseLeftButtonUp"> <Polyline x:Name="pp" Stroke="#FF000000"> <Polyline.RenderTransform> <TransformGroup> <RotateTransform x:Name="PolylineRotateTransform" CenterX="0" CenterY="0" Angle="0"/> <ScaleTransform x:Name="PolylineScaleTransform" CenterX="0" CenterY="0" ScaleX="1" ScaleY="1"/> </TransformGroup> </Polyline.RenderTransform> <Polyline.Resources> <Storyboard x:Name="PolylineAnimationStoryboard"> <DoubleAnimation Storyboard.TargetName="PolylineRotateTransform" Storyboard.TargetProperty="RenderTransform.Angle" From="0" To="360" Duration="0:0:2" AutoReverse="True"/> <DoubleAnimation Storyboard.TargetName="PolylineScaleTransform" Storyboard.TargetProperty="RenderTransform.ScaleX" From="1" To="0.1" Duration="0:0:2" AutoReverse="True"/> <DoubleAnimation Storyboard.TargetName="PolylineScaleTransform" Storyboard.TargetProperty="RenderTransform.ScaleY" From="1" To="0.1" Duration="0:0:2" AutoReverse="True"/> </Storyboard> </Polyline.Resources> </Polyline> </Canvas> <StackPanel x:Name="two_buttons" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Bottom"> <Button x:Name="close_polyline_button" Click="OnClosePolylineClick"/> <Button x:Name="animation_button" Click="OnAnimationClick" /> </StackPanel><!-- horizontal: close_polyline_button + animation_button--> </StackPanel> <!-- vertical: text_area + draw_area + 2 buttons--> </UserControl>
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Shapes; namespace SL_draw1 { public partial class Page : UserControl { Point p0 = new Point(); Point p1 = new Point(); Point mid = new Point(); double length; bool MouseButtonPressed = false; public Page() { InitializeComponent(); draw_area.Width = draw_area.Height = two_buttons.Width = 400; close_polyline_button.Width = animation_button.Width = two_buttons.Width/2; text_area.Text="Press the left mouse button and draw something!"; } private void OnMouseLeftButtonDown(object sender, MouseEventArgs e) { MouseButtonPressed = true; p0 = e.GetPosition( draw_area ); pp.Points.Clear(); pp.Points.Add( p0 ); text_area.Text = String.Format( "({0:D}/{1:D})", (int)p0.X, (int)p0.Y ); } private void OnMouseMove(object sender, MouseEventArgs e) { if ( !MouseButtonPressed ) return; p1 = e.GetPosition( draw_area ); double dx = p1.X - p0.X; double dy = p1.Y - p0.Y; if ( dx*dx+dy*dy < 100 ) return; pp.Points.Add( p1 ); p0 = p1; text_area.Text = String.Format( "(x={0:D}/y={1:D})", (int)p0.X, (int)p0.Y ); } private void OnMouseLeftButtonUp(object sender, MouseEventArgs e) { MouseButtonPressed = false; mid.X = mid.Y = 0; for ( int i=0; i < pp.Points.Count; i++ ) { mid.X += pp.Points[i].X; mid.Y += pp.Points[i].Y; } mid.X /= pp.Points.Count; mid.Y /= pp.Points.Count; length = 0; for ( int i=0; i < pp.Points.Count-1; i++ ) { double dx = pp.Points[i+1].X - pp.Points[i].X; double dy = pp.Points[i+1].Y - pp.Points[i].Y; length += Math.Sqrt( dx*dx + dy*dy ); } text_area.Text = "No. of Vertices = " + pp.Points.Count.ToString() + " Center of Gravity: " + String.Format( "({0:F0}/{1:F0})", mid.X, mid.Y ) + " Line Length: " + String.Format( "{0:F1}", length ); close_polyline_button.Content = "Close the polygon"; animation_button.Content = "Start the animation"; } private void OnAnimationClick(object sender, EventArgs e) { PolylineRotateTransform.CenterX = PolylineScaleTransform.CenterX = mid.X; PolylineRotateTransform.CenterY = PolylineScaleTransform.CenterY = mid.Y; PolylineAnimationStoryboard.Stop(); PolylineAnimationStoryboard.Begin(); } private void OnClosePolylineClick(object sender, EventArgs e) { p0 = pp.Points[0]; p1 = pp.Points[pp.Points.Count-1]; if ( p1 == p0 ) return; double dx = p1.X - p0.X; double dy = p1.Y - p0.Y; length += Math.Sqrt( dx*dx + dy*dy ); pp.Points.Add( p0 ); text_area.Text = "No. of Vertices = " + pp.Points.Count.ToString() + " Center of Gravity: " + String.Format( "({0:F0}/{1:F0})", mid.X, mid.Y ) + " Perimeter: " + String.Format( "{0:F1}", length ); close_polyline_button.Content = null; } } //end of class Page } //end of namespace
top of page: |