Moved mesh rendering code to a seperate assembly. This will allow other rendering implementations (like OpenGL) through IMeshRenderer interface.
git-svn-id: https://triangle.svn.codeplex.com/svn@69965 0e2699bc-83d4-4a8f-98e7-55e24ab8c7a5
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
public struct BoundingBox
|
||||
{
|
||||
public float Left;
|
||||
public float Right;
|
||||
public float Bottom;
|
||||
public float Top;
|
||||
|
||||
public float Width
|
||||
{
|
||||
get { return this.Right - this.Left; }
|
||||
}
|
||||
|
||||
public float Height
|
||||
{
|
||||
get { return this.Top - this.Bottom; }
|
||||
}
|
||||
|
||||
public BoundingBox(float left, float right, float bottom, float top)
|
||||
{
|
||||
this.Left = left;
|
||||
this.Right = right;
|
||||
this.Bottom = bottom;
|
||||
this.Top = top;
|
||||
}
|
||||
|
||||
public void Update(Point pt)
|
||||
{
|
||||
this.Update(pt.X, pt.Y);
|
||||
}
|
||||
|
||||
public void Update(PointF pt)
|
||||
{
|
||||
this.Update(pt.X, pt.Y);
|
||||
}
|
||||
|
||||
public void Update(double x, double y)
|
||||
{
|
||||
// Update bounding box
|
||||
if (this.Left > x) this.Left = (float)x;
|
||||
if (this.Right < x) this.Right = (float)x;
|
||||
if (this.Bottom > y) this.Bottom = (float)y;
|
||||
if (this.Top < y) this.Top = (float)y;
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
this.Left = float.MaxValue;
|
||||
this.Right = -float.MaxValue;
|
||||
this.Bottom = float.MaxValue;
|
||||
this.Top = -float.MaxValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
public class ColorManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a color scheme with black background.
|
||||
/// </summary>
|
||||
public static ColorManager Default()
|
||||
{
|
||||
var colors = new ColorManager();
|
||||
|
||||
colors.Background = Color.FromArgb(0, 0, 0);
|
||||
colors.Point = new SolidBrush(Color.Green);
|
||||
colors.SteinerPoint = new SolidBrush(Color.Peru);
|
||||
colors.Triangle = new SolidBrush(Color.Black);
|
||||
colors.Line = new Pen(Color.FromArgb(30, 30, 30));
|
||||
colors.Segment = new Pen(Color.DarkBlue);
|
||||
colors.VoronoiLine = new Pen(Color.FromArgb(40, 50, 60));
|
||||
|
||||
return colors;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a color scheme with white background.
|
||||
/// </summary>
|
||||
public static ColorManager LightScheme()
|
||||
{
|
||||
var colors = new ColorManager();
|
||||
|
||||
colors.Background = Color.White;
|
||||
colors.Point = new SolidBrush(Color.FromArgb(60, 80, 120));
|
||||
colors.SteinerPoint = new SolidBrush(Color.DarkGreen);
|
||||
colors.Triangle = new SolidBrush(Color.FromArgb(230, 240, 250));
|
||||
colors.Line = new Pen(Color.FromArgb(150, 150, 150));
|
||||
colors.Segment = new Pen(Color.SteelBlue);
|
||||
colors.VoronoiLine = new Pen(Color.FromArgb(160, 170, 180));
|
||||
|
||||
return colors;
|
||||
}
|
||||
|
||||
internal Color background;
|
||||
internal SolidBrush point;
|
||||
internal SolidBrush steinerPoint;
|
||||
internal SolidBrush triangle;
|
||||
internal Pen line;
|
||||
internal Pen segment;
|
||||
internal Pen voronoiLine;
|
||||
|
||||
#region Public properties
|
||||
|
||||
public Color Background
|
||||
{
|
||||
get { return background; }
|
||||
set { background = value; }
|
||||
}
|
||||
|
||||
public SolidBrush Point
|
||||
{
|
||||
get { return point; }
|
||||
set
|
||||
{
|
||||
if (point != null) point.Dispose();
|
||||
point = value;
|
||||
}
|
||||
}
|
||||
|
||||
public SolidBrush SteinerPoint
|
||||
{
|
||||
get { return steinerPoint; }
|
||||
set
|
||||
{
|
||||
if (steinerPoint != null) steinerPoint.Dispose();
|
||||
steinerPoint = value;
|
||||
}
|
||||
}
|
||||
|
||||
public SolidBrush Triangle
|
||||
{
|
||||
get { return triangle; }
|
||||
set
|
||||
{
|
||||
if (triangle != null) triangle.Dispose();
|
||||
triangle = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Pen Line
|
||||
{
|
||||
get { return line; }
|
||||
set
|
||||
{
|
||||
if (line != null) line.Dispose();
|
||||
line = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Pen Segment
|
||||
{
|
||||
get { return segment; }
|
||||
set
|
||||
{
|
||||
if (segment != null) segment.Dispose();
|
||||
segment = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Pen VoronoiLine
|
||||
{
|
||||
get { return voronoiLine; }
|
||||
set
|
||||
{
|
||||
if (voronoiLine != null) voronoiLine.Dispose();
|
||||
voronoiLine = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="ExtensionMethods.cs" company="">
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
using System;
|
||||
using System.Drawing;
|
||||
|
||||
/// <summary>
|
||||
/// Extension methods.
|
||||
/// </summary>
|
||||
public static class ExtensionMethods
|
||||
{
|
||||
#region Color extention methods
|
||||
|
||||
/// <summary>
|
||||
/// Converts a Color to a float array containing normalized R, G ,B, A values.
|
||||
/// </summary>
|
||||
public static float[] ToFloatArray4(this Color color)
|
||||
{
|
||||
return new float[] {
|
||||
((float)color.R) / 255.0f,
|
||||
((float)color.G) / 255.0f,
|
||||
((float)color.B) / 255.0f,
|
||||
((float)color.A) / 255.0f
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
+53
-40
@@ -4,7 +4,7 @@
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Rendering
|
||||
namespace MeshRenderer.Core.GDI
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -20,7 +20,7 @@ namespace MeshExplorer.Rendering
|
||||
{
|
||||
Zoom zoom;
|
||||
RenderData data;
|
||||
RenderColors renderColors;
|
||||
ColorManager renderColors;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="MeshRenderer" /> class.
|
||||
@@ -33,12 +33,12 @@ namespace MeshExplorer.Rendering
|
||||
/// <summary>
|
||||
/// Renders the mesh.
|
||||
/// </summary>
|
||||
public void Render(Graphics g, Zoom zoom, RenderColors renderColors)
|
||||
public void Render(Graphics g, Zoom zoom, ColorManager renderColors)
|
||||
{
|
||||
this.renderColors = renderColors;
|
||||
this.zoom = zoom;
|
||||
|
||||
if (data.Edges != null)
|
||||
if (data.MeshEdges != null)
|
||||
{
|
||||
this.RenderEdges(g);
|
||||
}
|
||||
@@ -61,12 +61,12 @@ namespace MeshExplorer.Rendering
|
||||
/// <summary>
|
||||
/// Renders only the mesh edges (no points or segments).
|
||||
/// </summary>
|
||||
public void RenderMesh(Graphics g, Zoom zoom, RenderColors renderColors)
|
||||
public void RenderMesh(Graphics g, Zoom zoom, ColorManager renderColors)
|
||||
{
|
||||
this.renderColors = renderColors;
|
||||
this.zoom = zoom;
|
||||
|
||||
if (data.Edges != null)
|
||||
if (data.MeshEdges != null)
|
||||
{
|
||||
this.RenderEdges(g);
|
||||
}
|
||||
@@ -79,7 +79,7 @@ namespace MeshExplorer.Rendering
|
||||
/// <summary>
|
||||
/// Renders only points and segments (no mesh triangles).
|
||||
/// </summary>
|
||||
public void RenderGeometry(Graphics g, Zoom zoom, RenderColors renderColors)
|
||||
public void RenderGeometry(Graphics g, Zoom zoom, ColorManager renderColors)
|
||||
{
|
||||
this.renderColors = renderColors;
|
||||
this.zoom = zoom;
|
||||
@@ -97,28 +97,30 @@ namespace MeshExplorer.Rendering
|
||||
|
||||
private void RenderPoints(Graphics g)
|
||||
{
|
||||
int i, k, n;
|
||||
PointF pt;
|
||||
PointF[] pts = data.Points;
|
||||
int i, n;
|
||||
float[] pts = data.Points;
|
||||
|
||||
// Draw input points
|
||||
n = data.NumberOfInputPoints;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
if (zoom.ViewportContains(pts[i]))
|
||||
k = 2 * i;
|
||||
if (zoom.ViewportContains(pts[k], pts[k + 1]))
|
||||
{
|
||||
pt = zoom.WorldToScreen(pts[i]);
|
||||
pt = zoom.WorldToScreen(pts[k], pts[k + 1]);
|
||||
g.FillEllipse(renderColors.Point, pt.X - 1.5f, pt.Y - 1.5f, 3, 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Draw Steiner points
|
||||
n = pts.Length;
|
||||
n = pts.Length / 2;
|
||||
for (; i < n; i++)
|
||||
{
|
||||
if (zoom.ViewportContains(pts[i]))
|
||||
k = 2 * i;
|
||||
if (zoom.ViewportContains(pts[k], pts[k + 1]))
|
||||
{
|
||||
pt = zoom.WorldToScreen(pts[i]);
|
||||
pt = zoom.WorldToScreen(pts[k], pts[k + 1]);
|
||||
g.FillEllipse(renderColors.SteinerPoint, pt.X - 1.5f, pt.Y - 1.5f, 3, 3);
|
||||
}
|
||||
}
|
||||
@@ -126,21 +128,25 @@ namespace MeshExplorer.Rendering
|
||||
|
||||
private void RenderTriangles(Graphics g)
|
||||
{
|
||||
int n = data.Triangles.Length / 3;
|
||||
uint k0, k1, k2;
|
||||
PointF p0, p1, p2;
|
||||
PointF[] pts = data.Points;
|
||||
|
||||
var triangles = data.Triangles;
|
||||
float[] pts = data.Points;
|
||||
|
||||
// Draw triangles
|
||||
foreach (var tri in triangles)
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (zoom.ViewportContains(pts[tri.P0]) ||
|
||||
zoom.ViewportContains(pts[tri.P1]) ||
|
||||
zoom.ViewportContains(pts[tri.P2]))
|
||||
k0 = 2 * data.Triangles[3 * i];
|
||||
k1 = 2 * data.Triangles[3 * i + 1];
|
||||
k2 = 2 * data.Triangles[3 * i + 2];
|
||||
|
||||
if (zoom.ViewportContains(pts[k0], pts[k0 + 1]) ||
|
||||
zoom.ViewportContains(pts[k1], pts[k1 + 1]) ||
|
||||
zoom.ViewportContains(pts[k2], pts[k2 + 1]))
|
||||
{
|
||||
p0 = zoom.WorldToScreen(pts[tri.P0]);
|
||||
p1 = zoom.WorldToScreen(pts[tri.P1]);
|
||||
p2 = zoom.WorldToScreen(pts[tri.P2]);
|
||||
p0 = zoom.WorldToScreen(pts[k0], pts[k0 + 1]);
|
||||
p1 = zoom.WorldToScreen(pts[k1], pts[k1 + 1]);
|
||||
p2 = zoom.WorldToScreen(pts[k2], pts[k2 + 1]);
|
||||
|
||||
g.DrawLine(renderColors.Line, p0, p1);
|
||||
g.DrawLine(renderColors.Line, p1, p2);
|
||||
@@ -151,19 +157,22 @@ namespace MeshExplorer.Rendering
|
||||
|
||||
private void RenderEdges(Graphics g)
|
||||
{
|
||||
int n = data.MeshEdges.Length / 2;
|
||||
uint k0, k1;
|
||||
PointF p0, p1;
|
||||
PointF[] pts = data.Points;
|
||||
|
||||
var edges = data.Edges;
|
||||
float[] pts = data.Points;
|
||||
|
||||
// Draw edges
|
||||
foreach (var edge in edges)
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (zoom.ViewportContains(pts[edge.P0]) ||
|
||||
zoom.ViewportContains(pts[edge.P1]))
|
||||
k0 = 2 * data.MeshEdges[2 * i];
|
||||
k1 = 2 * data.MeshEdges[2 * i + 1];
|
||||
|
||||
if (zoom.ViewportContains(pts[k0], pts[k0 + 1]) ||
|
||||
zoom.ViewportContains(pts[k1], pts[k1 + 1]))
|
||||
{
|
||||
p0 = zoom.WorldToScreen(pts[edge.P0]);
|
||||
p1 = zoom.WorldToScreen(pts[edge.P1]);
|
||||
p0 = zoom.WorldToScreen(pts[k0], pts[k0 + 1]);
|
||||
p1 = zoom.WorldToScreen(pts[k1], pts[k1 + 1]);
|
||||
|
||||
g.DrawLine(renderColors.Line, p0, p1);
|
||||
}
|
||||
@@ -172,18 +181,22 @@ namespace MeshExplorer.Rendering
|
||||
|
||||
private void RenderSegments(Graphics g)
|
||||
{
|
||||
int n = data.Segments.Length / 2;
|
||||
uint k0, k1;
|
||||
PointF p0, p1;
|
||||
PointF[] pts = data.Points;
|
||||
float[] pts = data.Points;
|
||||
|
||||
var segments = data.Segments;
|
||||
|
||||
foreach (var seg in segments)
|
||||
// Draw edges
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (zoom.ViewportContains(pts[seg.P0]) ||
|
||||
zoom.ViewportContains(pts[seg.P1]))
|
||||
k0 = 2 * data.Segments[2 * i];
|
||||
k1 = 2 * data.Segments[2 * i + 1];
|
||||
|
||||
if (zoom.ViewportContains(pts[k0], pts[k0 + 1]) ||
|
||||
zoom.ViewportContains(pts[k1], pts[k1 + 1]))
|
||||
{
|
||||
p0 = zoom.WorldToScreen(pts[seg.P0]);
|
||||
p1 = zoom.WorldToScreen(pts[seg.P1]);
|
||||
p0 = zoom.WorldToScreen(pts[k0], pts[k0 + 1]);
|
||||
p1 = zoom.WorldToScreen(pts[k1], pts[k1 + 1]);
|
||||
|
||||
g.DrawLine(renderColors.Segment, p0, p1);
|
||||
}
|
||||
+23
-72
@@ -4,24 +4,20 @@
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Controls
|
||||
namespace MeshRenderer.Core.GDI
|
||||
{
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Text;
|
||||
using System.Windows.Forms;
|
||||
using MeshExplorer.Rendering;
|
||||
using TriangleNet;
|
||||
using TriangleNet.IO;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Renders a mesh using GDI.
|
||||
/// </summary>
|
||||
public class RendererControl : Control
|
||||
public class RenderControl : Control, IMeshRenderer
|
||||
{
|
||||
// Rendering stuff
|
||||
private BufferedGraphics buffer;
|
||||
@@ -33,7 +29,7 @@ namespace MeshExplorer.Controls
|
||||
MeshRenderer meshRenderer;
|
||||
VoronoiRenderer voronoiRenderer;
|
||||
|
||||
RenderColors renderColors;
|
||||
ColorManager renderColors;
|
||||
|
||||
bool initialized = false;
|
||||
bool showVoronoi = false;
|
||||
@@ -51,36 +47,17 @@ namespace MeshExplorer.Controls
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether to show the voronoi diagram or not.
|
||||
/// Initializes a new instance of the <see cref="RenderControl" /> class.
|
||||
/// </summary>
|
||||
public bool ShowVoronoi
|
||||
{
|
||||
get { return showVoronoi; }
|
||||
set
|
||||
{
|
||||
showVoronoi = value;
|
||||
|
||||
if (voronoiRenderer != null && showVoronoi)
|
||||
{
|
||||
voronoiRenderer.Update();
|
||||
}
|
||||
|
||||
this.Render();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="RendererControl" /> class.
|
||||
/// </summary>
|
||||
public RendererControl()
|
||||
public RenderControl()
|
||||
{
|
||||
SetStyle(ControlStyles.ResizeRedraw, true);
|
||||
|
||||
renderColors = RenderColors.Default();
|
||||
renderColors = ColorManager.Default();
|
||||
|
||||
this.BackColor = renderColors.Background;
|
||||
|
||||
zoom = new Zoom();
|
||||
zoom = new Zoom(true);
|
||||
context = new BufferedGraphicsContext();
|
||||
data = new RenderData();
|
||||
|
||||
@@ -99,7 +76,7 @@ namespace MeshExplorer.Controls
|
||||
/// </summary>
|
||||
public void Initialize()
|
||||
{
|
||||
zoom.Initialize(this.ClientRectangle, this.ClientRectangle);
|
||||
zoom.Initialize(this.ClientRectangle);
|
||||
InitializeBuffer();
|
||||
|
||||
initialized = true;
|
||||
@@ -110,12 +87,19 @@ namespace MeshExplorer.Controls
|
||||
/// <summary>
|
||||
/// Updates the displayed input data.
|
||||
/// </summary>
|
||||
public void SetData(InputGeometry geometry)
|
||||
public void SetData(RenderData data)
|
||||
{
|
||||
data.SetData(geometry);
|
||||
this.data = data;
|
||||
|
||||
meshRenderer = new MeshRenderer(data);
|
||||
|
||||
this.showVoronoi = data.VoronoiPoints != null;
|
||||
|
||||
if (showVoronoi)
|
||||
{
|
||||
voronoiRenderer = new VoronoiRenderer(data);
|
||||
}
|
||||
|
||||
// Reset the zoom on new data
|
||||
zoom.Initialize(this.ClientRectangle, data.Bounds);
|
||||
|
||||
@@ -124,51 +108,16 @@ namespace MeshExplorer.Controls
|
||||
this.Render();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the displayed mesh data.
|
||||
/// </summary>
|
||||
/// <param name="initZoom">If true, the zoom will be reset.</param>
|
||||
public void SetData(Mesh mesh, bool initZoom)
|
||||
{
|
||||
data.SetData(mesh);
|
||||
|
||||
if (initZoom)
|
||||
{
|
||||
// Reset the zoom on new data
|
||||
zoom.Initialize(this.ClientRectangle, data.Bounds);
|
||||
}
|
||||
|
||||
meshRenderer = new MeshRenderer(data);
|
||||
voronoiRenderer = new VoronoiRenderer(mesh);
|
||||
|
||||
if (showVoronoi)
|
||||
{
|
||||
voronoiRenderer.Update();
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
|
||||
this.Render();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the displayed input data.
|
||||
/// </summary>
|
||||
public void SetData(Mesh mesh)
|
||||
{
|
||||
SetData(mesh, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Zoom to the given location.
|
||||
/// </summary>
|
||||
/// <param name="location">The zoom focus.</param>
|
||||
/// <param name="delta">Indicates whether to zoom in or out.</param>
|
||||
public void Zoom(PointF location, int delta)
|
||||
public void Zoom(float x, float y, int delta)
|
||||
{
|
||||
if (!initialized) return;
|
||||
|
||||
if (zoom.Update(delta, location.X / (float)this.Width, location.Y / (float)this.Height))
|
||||
if (zoom.ZoomUpdate(delta, x, y))
|
||||
{
|
||||
// Redraw
|
||||
this.Render();
|
||||
@@ -180,7 +129,7 @@ namespace MeshExplorer.Controls
|
||||
/// </summary>
|
||||
public void HandleResize()
|
||||
{
|
||||
zoom.Resize(this.ClientRectangle, data.Bounds);
|
||||
zoom.Initialize(this.ClientRectangle, data.Bounds);
|
||||
InitializeBuffer();
|
||||
}
|
||||
|
||||
@@ -270,11 +219,12 @@ namespace MeshExplorer.Controls
|
||||
|
||||
if (e.Button == MouseButtons.Middle)
|
||||
{
|
||||
zoom.Reset();
|
||||
zoom.ZoomReset();
|
||||
this.Render();
|
||||
}
|
||||
else if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
/*
|
||||
// Just in case ...
|
||||
timer.Stop();
|
||||
|
||||
@@ -286,6 +236,7 @@ namespace MeshExplorer.Controls
|
||||
this.Invalidate();
|
||||
|
||||
timer.Start();
|
||||
* */
|
||||
}
|
||||
|
||||
base.OnMouseClick(e);
|
||||
@@ -0,0 +1,72 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="VoronoiRenderer.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshRenderer.Core.GDI
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Tools;
|
||||
|
||||
/// <summary>
|
||||
/// Renders a (bounded) Voronoi diagram.
|
||||
/// </summary>
|
||||
public class VoronoiRenderer
|
||||
{
|
||||
RenderData data;
|
||||
ColorManager renderColors;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="VoronoiRenderer" /> class.
|
||||
/// </summary>
|
||||
public VoronoiRenderer(RenderData data)
|
||||
{
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Renders the voronoi diagram.
|
||||
/// </summary>
|
||||
public void Render(Graphics g, Zoom zoom, ColorManager renderColors)
|
||||
{
|
||||
this.renderColors = renderColors;
|
||||
|
||||
var points = data.VoronoiPoints;
|
||||
var edges = data.VoronoiEdges;
|
||||
|
||||
if (points != null && edges != null)
|
||||
{
|
||||
uint k;
|
||||
PointF p0, p1;
|
||||
int n = edges.Length / 2;
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
// First endpoint of voronoi edge
|
||||
k = edges[2 * i];
|
||||
p0 = new PointF(points[2 * k], points[2 * k + 1]);
|
||||
|
||||
// Second endpoint of voronoi edge
|
||||
k = edges[2 * i + 1];
|
||||
p1 = new PointF(points[2 * k], points[2 * k + 1]);
|
||||
|
||||
// Render the edge
|
||||
if (zoom.ViewportContains(p0.X, p0.Y) ||
|
||||
zoom.ViewportContains(p1.X, p1.Y))
|
||||
{
|
||||
p0 = zoom.WorldToScreen(p0.X, p0.Y);
|
||||
p1 = zoom.WorldToScreen(p1.X, p1.Y);
|
||||
|
||||
g.DrawLine(renderColors.VoronoiLine, p0, p1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="IMeshRenderer.cs" company="">
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
using System;
|
||||
|
||||
/// <summary>
|
||||
/// TODO: Update summary.
|
||||
/// </summary>
|
||||
public interface IMeshRenderer
|
||||
{
|
||||
void Zoom(float x, float y, int delta);
|
||||
void HandleResize();
|
||||
|
||||
void Initialize();
|
||||
|
||||
void SetData(RenderData data);
|
||||
|
||||
//void SetPoints(float[] points, int inputPoints);
|
||||
//void SetTriangles(uint[] triangles);
|
||||
//void SetSegments(uint[] segments);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>MeshRenderer.Core</RootNamespace>
|
||||
<AssemblyName>MeshRenderer.Core</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<SccProjectName>SAK</SccProjectName>
|
||||
<SccLocalPath>SAK</SccLocalPath>
|
||||
<SccAuxPath>SAK</SccAuxPath>
|
||||
<SccProvider>SAK</SccProvider>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BoundingBox.cs" />
|
||||
<Compile Include="ColorManager.cs" />
|
||||
<Compile Include="ExtensionMethods.cs" />
|
||||
<Compile Include="GDI\MeshRenderer.cs" />
|
||||
<Compile Include="GDI\RenderControl.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="GDI\VoronoiRenderer.cs" />
|
||||
<Compile Include="IMeshRenderer.cs" />
|
||||
<Compile Include="RenderData.cs" />
|
||||
<Compile Include="RenderManager.cs" />
|
||||
<Compile Include="Zoom.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Triangle\Triangle.csproj">
|
||||
<Project>{F7907A0A-B75F-400B-9E78-BFAD00DB4D6B}</Project>
|
||||
<Name>Triangle</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
""
|
||||
{
|
||||
"FILE_VERSION" = "9237"
|
||||
"ENLISTMENT_CHOICE" = "NEVER"
|
||||
"PROJECT_FILE_RELATIVE_PATH" = ""
|
||||
"NUMBER_OF_EXCLUDED_FILES" = "0"
|
||||
"ORIGINAL_PROJECT_FILE_PATH" = ""
|
||||
"NUMBER_OF_NESTED_PROJECTS" = "0"
|
||||
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("MeshRenderer.Core")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("MeshRenderer.Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("99ca6350-3202-47b0-9645-d07b1ac4a294")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,185 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="RenderData.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Drawing;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
using TriangleNet.Tools;
|
||||
|
||||
/// <summary>
|
||||
/// Stores the current mesh in a rendering friendly data structure.
|
||||
/// </summary>
|
||||
public class RenderData
|
||||
{
|
||||
public float[] Points;
|
||||
public uint[] Segments;
|
||||
public uint[] Triangles;
|
||||
public uint[] MeshEdges;
|
||||
public float[] VoronoiPoints;
|
||||
public uint[] VoronoiEdges;
|
||||
|
||||
public int NumberOfInputPoints;
|
||||
public BoundingBox Bounds;
|
||||
|
||||
/// <summary>
|
||||
/// Copy input geometry data.
|
||||
/// </summary>
|
||||
public void SetInputGeometry(InputGeometry data)
|
||||
{
|
||||
// Clear unused buffers
|
||||
this.Segments = null;
|
||||
this.Triangles = null;
|
||||
this.MeshEdges = null;
|
||||
this.VoronoiPoints = null;
|
||||
this.VoronoiEdges = null;
|
||||
|
||||
int n = data.Count;
|
||||
int i = 0;
|
||||
|
||||
this.NumberOfInputPoints = n;
|
||||
|
||||
// Copy points
|
||||
this.Points = new float[2 * n];
|
||||
foreach (var pt in data.Points)
|
||||
{
|
||||
this.Points[2 * i] = (float)pt.X;
|
||||
this.Points[2 * i + 1] = (float)pt.Y;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Copy segments
|
||||
n = data.Segments.Count;
|
||||
if (n > 0)
|
||||
{
|
||||
var segments = new List<uint>(2 * n);
|
||||
foreach (var seg in data.Segments)
|
||||
{
|
||||
segments.Add((uint)seg.P0);
|
||||
segments.Add((uint)seg.P1);
|
||||
}
|
||||
this.Segments = segments.ToArray();
|
||||
}
|
||||
|
||||
this.Bounds = new BoundingBox(
|
||||
(float)data.Bounds.Xmin,
|
||||
(float)data.Bounds.Xmax,
|
||||
(float)data.Bounds.Ymin,
|
||||
(float)data.Bounds.Ymax);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy mesh data.
|
||||
/// </summary>
|
||||
public void SetMesh(Mesh mesh)
|
||||
{
|
||||
// Clear unused buffers
|
||||
this.Segments = null;
|
||||
this.VoronoiPoints = null;
|
||||
this.VoronoiEdges = null;
|
||||
|
||||
int n = mesh.Vertices.Count;
|
||||
int i = 0;
|
||||
|
||||
this.NumberOfInputPoints = mesh.NumberOfInputPoints;
|
||||
|
||||
// Linear numbering of mesh
|
||||
mesh.Renumber();
|
||||
|
||||
// Copy points
|
||||
this.Points = new float[2 * n];
|
||||
foreach (var pt in mesh.Vertices)
|
||||
{
|
||||
this.Points[2 * i] = (float)pt.X;
|
||||
this.Points[2 * i + 1] = (float)pt.Y;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Copy segments
|
||||
n = mesh.Segments.Count;
|
||||
if (n > 0)
|
||||
{
|
||||
var segments = new List<uint>(2 * n);
|
||||
foreach (var seg in mesh.Segments)
|
||||
{
|
||||
segments.Add((uint)seg.P0);
|
||||
segments.Add((uint)seg.P1);
|
||||
}
|
||||
this.Segments = segments.ToArray();
|
||||
}
|
||||
|
||||
// Copy edges
|
||||
var edges = new List<uint>(2 * mesh.NumberOfEdges);
|
||||
|
||||
EdgeEnumerator e = new EdgeEnumerator(mesh);
|
||||
while (e.MoveNext())
|
||||
{
|
||||
edges.Add((uint)e.Current.P0);
|
||||
edges.Add((uint)e.Current.P1);
|
||||
}
|
||||
this.MeshEdges = edges.ToArray();
|
||||
|
||||
// Copy Triangles
|
||||
var triangles = new List<uint>(3 * mesh.Triangles.Count);
|
||||
foreach (var tri in mesh.Triangles)
|
||||
{
|
||||
triangles.Add((uint)tri.P0);
|
||||
triangles.Add((uint)tri.P1);
|
||||
triangles.Add((uint)tri.P2);
|
||||
}
|
||||
this.Triangles = triangles.ToArray();
|
||||
|
||||
this.Bounds = new BoundingBox(
|
||||
(float)mesh.Bounds.Xmin,
|
||||
(float)mesh.Bounds.Xmax,
|
||||
(float)mesh.Bounds.Ymin,
|
||||
(float)mesh.Bounds.Ymax);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy voronoi data.
|
||||
/// </summary>
|
||||
public void SetVoronoi(IVoronoi voro)
|
||||
{
|
||||
SetVoronoi(voro, 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy voronoi data.
|
||||
/// </summary>
|
||||
public void SetVoronoi(IVoronoi voro, int infCount)
|
||||
{
|
||||
/*
|
||||
int i, n = voro.VertexList.Count;
|
||||
|
||||
// Copy points
|
||||
this.VoronoiPoints = new float[2 * n + infCount];
|
||||
foreach (var v in voro.VertexList)
|
||||
{
|
||||
i = v.Id;
|
||||
this.VoronoiPoints[2 * i] = (float)v.X;
|
||||
this.VoronoiPoints[2 * i + 1] = (float)v.Y;
|
||||
}
|
||||
|
||||
// Copy edges
|
||||
var edges = new List<uint>(voro.HalfEdgeList.Count);
|
||||
foreach (var edge in voro.Edges)
|
||||
{
|
||||
if (edge.P0 >= 0 && edge.P1 >= 0)
|
||||
{
|
||||
edges.Add((uint)edge.P0);
|
||||
edges.Add((uint)edge.P1);
|
||||
}
|
||||
}
|
||||
this.VoronoiEdges = edges.ToArray();
|
||||
* */
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="RenderManager.cs" company="">
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
|
||||
/// <summary>
|
||||
/// This is a proxy to an actual IMeshRenderer instance.
|
||||
/// </summary>
|
||||
public class RenderManager : IMeshRenderer
|
||||
{
|
||||
IMeshRenderer renderer;
|
||||
|
||||
public Control RenderControl
|
||||
{
|
||||
get { return (Control)renderer; }
|
||||
set
|
||||
{
|
||||
if (value is IMeshRenderer)
|
||||
{
|
||||
renderer = (IMeshRenderer)value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
renderer.Initialize();
|
||||
}
|
||||
|
||||
public void Zoom(float x, float y, int delta)
|
||||
{
|
||||
renderer.Zoom(x, y, delta);
|
||||
}
|
||||
|
||||
public void HandleResize()
|
||||
{
|
||||
renderer.HandleResize();
|
||||
}
|
||||
|
||||
public void SetData(RenderData data)
|
||||
{
|
||||
renderer.SetData(data);
|
||||
}
|
||||
|
||||
public void CreateDefaultControl()
|
||||
{
|
||||
this.RenderControl = new MeshRenderer.Core.GDI.RenderControl();
|
||||
}
|
||||
|
||||
public bool CreateControl(string assemblyName)
|
||||
{
|
||||
return CreateControl(assemblyName, null);
|
||||
}
|
||||
|
||||
public bool CreateControl(string assemblyName, string[] dependencies)
|
||||
{
|
||||
// Check if assembly exists
|
||||
if (!File.Exists(assemblyName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if dependencies exists
|
||||
if (dependencies != null)
|
||||
{
|
||||
foreach (var item in dependencies)
|
||||
{
|
||||
if (!File.Exists(item))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assemblyName = Path.GetFileNameWithoutExtension(assemblyName);
|
||||
|
||||
// Try creating renderer instance.
|
||||
try
|
||||
{
|
||||
// Load the assembly into the current application domain.
|
||||
Assembly assembly = Assembly.Load(assemblyName);
|
||||
|
||||
// Get all types implementing the IMeshRenderer interface.
|
||||
var type = typeof(IMeshRenderer);
|
||||
var types = assembly.GetTypes().Where(s => type.IsAssignableFrom(s)).ToArray();
|
||||
|
||||
if (types.Length > 0)
|
||||
{
|
||||
// Create an instance.
|
||||
renderer = (IMeshRenderer)Activator.CreateInstance(types[0]);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return true if render control was successfully created.
|
||||
return (renderer != null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="Zoom.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Rendering
|
||||
namespace MeshRenderer.Core
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -13,50 +13,61 @@ namespace MeshExplorer.Rendering
|
||||
using System.Drawing;
|
||||
|
||||
/// <summary>
|
||||
/// Manages the current world to screen transformation.
|
||||
/// Manages the current world to screen transformation
|
||||
/// </summary>
|
||||
public class Zoom
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the screen dimensions (render control).
|
||||
/// </summary>
|
||||
Rectangle Screen { get; set; }
|
||||
// The complete mesh
|
||||
Rectangle Screen;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the world dimensions (mesh).
|
||||
/// </summary>
|
||||
// The complete mesh
|
||||
RectangleF World { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current viewport (visible mesh).
|
||||
/// </summary>
|
||||
public RectangleF Viewport { get; private set; }
|
||||
// The current viewport (visible mesh)
|
||||
public RectangleF Viewport { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current scale (zoom level)
|
||||
/// </summary>
|
||||
public int Level { get; private set; }
|
||||
|
||||
public float ClipMargin { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Zoom" /> class.
|
||||
/// </summary>
|
||||
public Zoom()
|
||||
// Current scale (zoom level)
|
||||
public float Scale
|
||||
{
|
||||
Level = -1;
|
||||
get { return Screen.Width / Viewport.Width; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize the zoom.
|
||||
/// </summary>
|
||||
/// <param name="screen">The screen dimensions.</param>
|
||||
/// <param name="world">The world dimensions.</param>
|
||||
public void Initialize(Rectangle screen, RectangleF world)
|
||||
// Current scale (zoom level)
|
||||
public int Level { get; private set; }
|
||||
|
||||
// Add a margin to clip region (5% of viewport width on each side)
|
||||
public float ClipMargin { get; set; }
|
||||
|
||||
bool invertY = false;
|
||||
|
||||
public Zoom()
|
||||
: this(false)
|
||||
{
|
||||
}
|
||||
|
||||
public Zoom(bool invertY)
|
||||
{
|
||||
Level = -1;
|
||||
this.invertY = invertY;
|
||||
}
|
||||
|
||||
public void Initialize(Rectangle screen)
|
||||
{
|
||||
this.Screen = screen;
|
||||
|
||||
this.Level = 1;
|
||||
|
||||
this.Viewport = screen;
|
||||
|
||||
this.ClipMargin = this.Viewport.Width * 0.05f;
|
||||
|
||||
this.World = screen;
|
||||
}
|
||||
|
||||
public void Initialize(Rectangle screen, BoundingBox world)
|
||||
{
|
||||
this.Screen = screen;
|
||||
|
||||
this.World = world;
|
||||
this.Level = 1;
|
||||
|
||||
// Add a margin so there's some space around the border
|
||||
@@ -73,8 +84,8 @@ namespace MeshExplorer.Rendering
|
||||
scale = (world.Height + worldMargin) / screen.Height;
|
||||
}
|
||||
|
||||
float centerX = world.X + world.Width / 2;
|
||||
float centerY = world.Y + world.Height / 2;
|
||||
float centerX = world.Left + world.Width / 2;
|
||||
float centerY = world.Bottom + world.Height / 2;
|
||||
|
||||
// TODO: Add initial margin
|
||||
this.Viewport = new RectangleF(centerX - screen.Width * scale / 2,
|
||||
@@ -87,21 +98,29 @@ namespace MeshExplorer.Rendering
|
||||
this.World = this.Viewport;
|
||||
}
|
||||
|
||||
public void Resize(Rectangle screen, RectangleF world)
|
||||
public void Update(BoundingBox world)
|
||||
{
|
||||
this.Initialize(screen, world);
|
||||
if (this.Screen != null)
|
||||
{
|
||||
Initialize(this.Screen, world);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Zoom in or out of the viewport.
|
||||
/// </summary>
|
||||
/// <param name="amount">Zoom amount</param>
|
||||
/// <param name="focusX">Relative x point position (between 0 and 1)</param>
|
||||
/// <param name="focusY">Relative y point position (between 0 and 1)</param>
|
||||
public bool Update(int amount, float focusX, float focusY)
|
||||
/// <param name="focusX">Relative x point position</param>
|
||||
/// <param name="focusY">Relative y point position</param>
|
||||
public bool ZoomUpdate(int amount, float focusX, float focusY)
|
||||
{
|
||||
float width, height;
|
||||
|
||||
if (invertY)
|
||||
{
|
||||
focusY = 1 - focusY;
|
||||
}
|
||||
|
||||
if (amount > 0) // Zoom in
|
||||
{
|
||||
this.Level++;
|
||||
@@ -132,11 +151,11 @@ namespace MeshExplorer.Rendering
|
||||
|
||||
// Current focus on viewport
|
||||
float x = Viewport.X + Viewport.Width * focusX;
|
||||
float y = Viewport.Y + Viewport.Height * (1 - focusY);
|
||||
float y = Viewport.Y + Viewport.Height * focusY;
|
||||
|
||||
// New left and top positions
|
||||
x = x - width * focusX;
|
||||
y = y - height * (1 - focusY);
|
||||
y = y - height * focusY;
|
||||
|
||||
// Check if outside of world
|
||||
if (x < World.X)
|
||||
@@ -165,31 +184,28 @@ namespace MeshExplorer.Rendering
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check current point (world coordinates) lies inside the viewport.
|
||||
/// </summary>
|
||||
public bool ViewportContains(PointF pt)
|
||||
{
|
||||
return (pt.X > Viewport.X && pt.X < Viewport.Right
|
||||
&& pt.Y > Viewport.Y && pt.Y < Viewport.Bottom);
|
||||
}
|
||||
|
||||
public PointF WorldToScreen(PointF pt)
|
||||
{
|
||||
return new PointF((pt.X - Viewport.X) / Viewport.Width * Screen.Width,
|
||||
(1 - (pt.Y - Viewport.Y) / Viewport.Height) * Screen.Height);
|
||||
}
|
||||
|
||||
public PointF ScreenToWorld(float ptX, float ptY)
|
||||
{
|
||||
return new PointF(Viewport.X + Viewport.Width * ptX,
|
||||
Viewport.Y + Viewport.Height * (1 - ptY));
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
public void ZoomReset()
|
||||
{
|
||||
this.Viewport = this.World;
|
||||
this.Level = 1;
|
||||
}
|
||||
|
||||
public bool ViewportContains(float x, float y)
|
||||
{
|
||||
return (x > Viewport.X && x < Viewport.Right
|
||||
&& y > Viewport.Y && y < Viewport.Bottom);
|
||||
}
|
||||
|
||||
public PointF WorldToScreen(float x, float y)
|
||||
{
|
||||
return new PointF((x - Viewport.X) / Viewport.Width * Screen.Width,
|
||||
(1 - (y - Viewport.Y) / Viewport.Height) * Screen.Height);
|
||||
}
|
||||
|
||||
public PointF ScreenToWorld(float x, float y)
|
||||
{
|
||||
return new PointF(Viewport.X + Viewport.Width * x,
|
||||
Viewport.Y + Viewport.Height * (1 - y));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,193 +0,0 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="Examples.cs" company="">
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.IO;
|
||||
using TriangleNet.Geometry;
|
||||
using MeshExplorer.IO;
|
||||
using MeshExplorer.Rendering;
|
||||
|
||||
/// <summary>
|
||||
/// Code of the online examples.
|
||||
/// </summary>
|
||||
public static class Examples
|
||||
{
|
||||
// Make sure this path points to the polygon sample data.
|
||||
static readonly string pathToData = @"..\..\..\Data\";
|
||||
|
||||
static RasterImage imageWriter = new RasterImage();
|
||||
|
||||
/// <summary>
|
||||
/// Generating Delaunay triangulations
|
||||
/// </summary>
|
||||
public static void Example1()
|
||||
{
|
||||
imageWriter.ColorScheme = RenderColors.LightScheme();
|
||||
|
||||
// Create a mesh instance.
|
||||
Mesh mesh = new Mesh();
|
||||
|
||||
// Read spiral node file and gernerate the delaunay triangulation
|
||||
// of the point set.
|
||||
mesh.Triangulate(pathToData + "spiral.node");
|
||||
imageWriter.Export(mesh, "spiral.png", 180);
|
||||
|
||||
// Read face polygon file and gernerate the delaunay triangulation
|
||||
// of the PSLG. We reuse the mesh instance here.
|
||||
InputGeometry data = FileReader.Read(pathToData + "face.poly");
|
||||
mesh.Triangulate(data);
|
||||
imageWriter.Export(mesh, "face.png", 200);
|
||||
|
||||
// Generate a conforming delaunay triangulation of the face polygon.
|
||||
mesh.SetOption(Options.ConformingDelaunay, true);
|
||||
mesh.Triangulate(data);
|
||||
imageWriter.Export(mesh, "face-CDT.png", 200);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Quality meshing: angle and size constraints
|
||||
/// </summary>
|
||||
public static void Example2()
|
||||
{
|
||||
imageWriter.ColorScheme = RenderColors.LightScheme();
|
||||
|
||||
// Create a mesh instance.
|
||||
Mesh mesh = new Mesh();
|
||||
|
||||
// Read spiral node file and gernerate the delaunay triangulation.
|
||||
// Set the mesh quality option to true, which will set a default
|
||||
// minimum angle of 20 degrees.
|
||||
InputGeometry data = FileReader.ReadNodeFile(pathToData + "spiral.node");
|
||||
mesh.SetOption(Options.Quality, true);
|
||||
mesh.Triangulate(data);
|
||||
imageWriter.Export(mesh, "spiral-Angle-20.png", 200);
|
||||
|
||||
// Set a minimum angle of 30 degrees.
|
||||
mesh.SetOption(Options.MinAngle, 35);
|
||||
mesh.Triangulate(data);
|
||||
imageWriter.Export(mesh, "spiral-Angle-35.png", 200);
|
||||
|
||||
// Reset the minimum angle and add a global area constraint.
|
||||
mesh.SetOption(Options.MinAngle, 20);
|
||||
mesh.SetOption(Options.MaxArea, 0.2);
|
||||
mesh.Triangulate(data);
|
||||
imageWriter.Export(mesh, "spiral-Area.png", 200);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Refining preexisting meshes
|
||||
/// </summary>
|
||||
public static void Example3()
|
||||
{
|
||||
imageWriter.ColorScheme = RenderColors.LightScheme();
|
||||
|
||||
// Create a mesh instance.
|
||||
Mesh mesh = new Mesh();
|
||||
|
||||
// Gernerate a quality delaunay triangulation of box
|
||||
// polygon, containing the convex hull.
|
||||
mesh.SetOption(Options.Quality, true);
|
||||
mesh.SetOption(Options.Convex, true);
|
||||
mesh.Triangulate(pathToData + "box.poly");
|
||||
imageWriter.Export(mesh, "box.png", 200);
|
||||
|
||||
// Save the current mesh to .node and .ele files
|
||||
FileWriter.WriteNodes(mesh, "box.1.node");
|
||||
FileWriter.WriteElements(mesh, "box.1.ele");
|
||||
|
||||
// Refine the mesh by setting a global area constraint.
|
||||
mesh.Refine(0.2);
|
||||
imageWriter.Export(mesh, "box-Refine-1.png", 200);
|
||||
|
||||
// Refine again by setting a smaller area constraint.
|
||||
mesh.Refine(0.05);
|
||||
imageWriter.Export(mesh, "box-Refine-2.png", 200);
|
||||
|
||||
// Load the previously saved box.1 mesh. Since a box.1.area
|
||||
// file exist, the variable area constraint option is set
|
||||
// and will be applied for refinement.
|
||||
mesh.Load(pathToData + "box.1.node");
|
||||
mesh.SetOption(Options.MinAngle, 0);
|
||||
mesh.Refine();
|
||||
imageWriter.Export(mesh, "box-Refine-3.png", 200);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Drawing the Voronoi diagram.
|
||||
/// </summary>
|
||||
public static void Example4()
|
||||
{
|
||||
//imageWriter.SetColorSchemeLight();
|
||||
|
||||
//// Create mesh data (random point set)
|
||||
////data.Points = Util.CreateCirclePoints(0, 0, 5, 50); // Ooops, TODO !!!
|
||||
//InputGeometry data = PolygonGenerator.CreateStarPoints(0, 0, 5, 10);
|
||||
|
||||
//// Create a mesh instance.
|
||||
//Mesh mesh = new Mesh();
|
||||
|
||||
//// Gernerate a delaunay triangulation
|
||||
//mesh.Triangulate(data);
|
||||
//ImageWriter.WritePng(mesh, "circle-mesh.png", 400);
|
||||
//ImageWriter.WriteVoronoiPng(mesh, "circle-voronoi.png", 400);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Smoothing a mesh.
|
||||
/// </summary>
|
||||
public static void Example5()
|
||||
{
|
||||
//ImageWriter.SetColorSchemeLight();
|
||||
|
||||
//// Create a mesh instance.
|
||||
//Mesh mesh = new Mesh();
|
||||
|
||||
//mesh.SetOption(Options.Quality, true);
|
||||
//mesh.SetOption(Options.MinAngle, 25);
|
||||
//mesh.SetOption(Options.MaxArea, 0.0075);
|
||||
//mesh.Triangulate(pathToData + "Smooth-Slit.poly");
|
||||
//mesh.Smooth();
|
||||
|
||||
//ImageWriter.WritePng(mesh, "slit-smooth.png", 300);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Smoothing a mesh.
|
||||
/// </summary>
|
||||
public static void ExampleXYZ()
|
||||
{
|
||||
//ImageWriter.SetColorSchemeLight();
|
||||
|
||||
//Mesh mesh = new Mesh();
|
||||
|
||||
//mesh.SetOption(Options.Quality, true);
|
||||
//mesh.SetOption(Options.MinAngle, 25);
|
||||
//mesh.SetOption(Options.MaxArea, 0.05);
|
||||
|
||||
//mesh.Triangulate(pathToData + "Smooth-Square.poly");
|
||||
|
||||
//ImageWriter.WritePng(mesh, "test1.png", 300);
|
||||
|
||||
//mesh.SetOption(Options.MaxArea, 0.01);
|
||||
|
||||
//// Refine with new max area
|
||||
//mesh.Refine();
|
||||
|
||||
//ImageWriter.WritePng(mesh, "test2.png", 300);
|
||||
|
||||
//mesh.SetOption(Options.SteinerPoints, 50);
|
||||
//mesh.Triangulate(pathToData + "Smooth-Square.poly");
|
||||
|
||||
//ImageWriter.WritePng(mesh, "test3.png", 300);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,20 @@ namespace MeshExplorer
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void AddItem(string message, bool warning)
|
||||
{
|
||||
ILog<SimpleLogItem> log = SimpleLog.Instance;
|
||||
|
||||
if (warning)
|
||||
{
|
||||
log.Warning(message, "Mesh Explorer");
|
||||
}
|
||||
else
|
||||
{
|
||||
log.Info(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateItems()
|
||||
{
|
||||
listLog.Items.Clear();
|
||||
|
||||
+38
-712
@@ -32,60 +32,11 @@
|
||||
this.btnSmooth = new MeshExplorer.Controls.DarkButton();
|
||||
this.flatTabControl1 = new MeshExplorer.Controls.DarkTabControl();
|
||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
||||
this.lbMaxArea = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.lbMinAngle = new System.Windows.Forms.Label();
|
||||
this.label23 = new System.Windows.Forms.Label();
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.slMaxArea = new MeshExplorer.Controls.DarkSlider();
|
||||
this.slMinAngle = new MeshExplorer.Controls.DarkSlider();
|
||||
this.cbConformDel = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.cbConvex = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.cbQuality = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.meshControlView = new MeshExplorer.Views.MeshControlView();
|
||||
this.tabPage2 = new System.Windows.Forms.TabPage();
|
||||
this.label20 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.lbNumSeg = new System.Windows.Forms.Label();
|
||||
this.lbNumSeg2 = new System.Windows.Forms.Label();
|
||||
this.lbNumTri = new System.Windows.Forms.Label();
|
||||
this.lbNumTri2 = new System.Windows.Forms.Label();
|
||||
this.lbNumVert = new System.Windows.Forms.Label();
|
||||
this.lbNumVert2 = new System.Windows.Forms.Label();
|
||||
this.label32 = new System.Windows.Forms.Label();
|
||||
this.label13 = new System.Windows.Forms.Label();
|
||||
this.label31 = new System.Windows.Forms.Label();
|
||||
this.label12 = new System.Windows.Forms.Label();
|
||||
this.label16 = new System.Windows.Forms.Label();
|
||||
this.label29 = new System.Windows.Forms.Label();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.lbAngleMax = new System.Windows.Forms.Label();
|
||||
this.lbQualAspectAve = new System.Windows.Forms.Label();
|
||||
this.lbEdgeMax = new System.Windows.Forms.Label();
|
||||
this.lbQualAlphaAve = new System.Windows.Forms.Label();
|
||||
this.lbAreaMax = new System.Windows.Forms.Label();
|
||||
this.lbAngleMin = new System.Windows.Forms.Label();
|
||||
this.lbQualAspectMin = new System.Windows.Forms.Label();
|
||||
this.lbEdgeMin = new System.Windows.Forms.Label();
|
||||
this.lbQualAlphaMin = new System.Windows.Forms.Label();
|
||||
this.lbAreaMin = new System.Windows.Forms.Label();
|
||||
this.label22 = new System.Windows.Forms.Label();
|
||||
this.label10 = new System.Windows.Forms.Label();
|
||||
this.label17 = new System.Windows.Forms.Label();
|
||||
this.label21 = new System.Windows.Forms.Label();
|
||||
this.label11 = new System.Windows.Forms.Label();
|
||||
this.angleHistogram1 = new MeshExplorer.Controls.AngleHistogram();
|
||||
this.statisticView = new MeshExplorer.Views.StatisticView();
|
||||
this.tabPage3 = new System.Windows.Forms.TabPage();
|
||||
this.lbCodeplex = new System.Windows.Forms.Label();
|
||||
this.label15 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label19 = new System.Windows.Forms.Label();
|
||||
this.label18 = new System.Windows.Forms.Label();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.lbShortcuts = new System.Windows.Forms.Label();
|
||||
this.aboutView = new MeshExplorer.Views.AboutView();
|
||||
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
|
||||
this.menuFile = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.menuFileOpen = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -104,10 +55,8 @@
|
||||
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.menuToolsRcm = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.btnMesh = new MeshExplorer.Controls.DarkButton();
|
||||
this.renderControl1 = new MeshExplorer.Controls.RendererControl();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.flatTabControl1.SuspendLayout();
|
||||
this.tabPage1.SuspendLayout();
|
||||
@@ -136,7 +85,6 @@
|
||||
// splitContainer1.Panel2
|
||||
//
|
||||
this.splitContainer1.Panel2.BackColor = System.Drawing.Color.Black;
|
||||
this.splitContainer1.Panel2.Controls.Add(this.renderControl1);
|
||||
this.splitContainer1.Size = new System.Drawing.Size(984, 612);
|
||||
this.splitContainer1.SplitterDistance = 280;
|
||||
this.splitContainer1.SplitterWidth = 1;
|
||||
@@ -168,18 +116,7 @@
|
||||
// tabPage1
|
||||
//
|
||||
this.tabPage1.BackColor = System.Drawing.Color.DimGray;
|
||||
this.tabPage1.Controls.Add(this.lbMaxArea);
|
||||
this.tabPage1.Controls.Add(this.label6);
|
||||
this.tabPage1.Controls.Add(this.lbMinAngle);
|
||||
this.tabPage1.Controls.Add(this.label23);
|
||||
this.tabPage1.Controls.Add(this.label9);
|
||||
this.tabPage1.Controls.Add(this.label8);
|
||||
this.tabPage1.Controls.Add(this.label5);
|
||||
this.tabPage1.Controls.Add(this.slMaxArea);
|
||||
this.tabPage1.Controls.Add(this.slMinAngle);
|
||||
this.tabPage1.Controls.Add(this.cbConformDel);
|
||||
this.tabPage1.Controls.Add(this.cbConvex);
|
||||
this.tabPage1.Controls.Add(this.cbQuality);
|
||||
this.tabPage1.Controls.Add(this.meshControlView);
|
||||
this.tabPage1.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.tabPage1.Location = new System.Drawing.Point(4, 4);
|
||||
this.tabPage1.Name = "tabPage1";
|
||||
@@ -187,175 +124,20 @@
|
||||
this.tabPage1.TabIndex = 0;
|
||||
this.tabPage1.Text = "Mesh Control";
|
||||
//
|
||||
// lbMaxArea
|
||||
// meshControlView
|
||||
//
|
||||
this.lbMaxArea.AutoSize = true;
|
||||
this.lbMaxArea.ForeColor = System.Drawing.Color.White;
|
||||
this.lbMaxArea.Location = new System.Drawing.Point(227, 66);
|
||||
this.lbMaxArea.Name = "lbMaxArea";
|
||||
this.lbMaxArea.Size = new System.Drawing.Size(13, 13);
|
||||
this.lbMaxArea.TabIndex = 14;
|
||||
this.lbMaxArea.Text = "0";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.ForeColor = System.Drawing.Color.White;
|
||||
this.label6.Location = new System.Drawing.Point(8, 65);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(81, 13);
|
||||
this.label6.TabIndex = 14;
|
||||
this.label6.Text = "Maximum area";
|
||||
//
|
||||
// lbMinAngle
|
||||
//
|
||||
this.lbMinAngle.AutoSize = true;
|
||||
this.lbMinAngle.ForeColor = System.Drawing.Color.White;
|
||||
this.lbMinAngle.Location = new System.Drawing.Point(227, 44);
|
||||
this.lbMinAngle.Name = "lbMinAngle";
|
||||
this.lbMinAngle.Size = new System.Drawing.Size(19, 13);
|
||||
this.lbMinAngle.TabIndex = 14;
|
||||
this.lbMinAngle.Text = "20";
|
||||
//
|
||||
// label23
|
||||
//
|
||||
this.label23.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label23.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label23.Location = new System.Drawing.Point(8, 152);
|
||||
this.label23.Name = "label23";
|
||||
this.label23.Size = new System.Drawing.Size(251, 33);
|
||||
this.label23.TabIndex = 14;
|
||||
this.label23.Text = "Ensure that all triangles in the mesh are truly Delaunay, and not just constraine" +
|
||||
"d Delaunay.";
|
||||
//
|
||||
// label9
|
||||
//
|
||||
this.label9.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label9.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label9.Location = new System.Drawing.Point(8, 216);
|
||||
this.label9.Name = "label9";
|
||||
this.label9.Size = new System.Drawing.Size(258, 33);
|
||||
this.label9.TabIndex = 14;
|
||||
this.label9.Text = "Use the convex mesh option, if the convex hull should be included in the output.";
|
||||
//
|
||||
// label8
|
||||
//
|
||||
this.label8.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label8.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label8.Location = new System.Drawing.Point(8, 89);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(258, 33);
|
||||
this.label8.TabIndex = 14;
|
||||
this.label8.Text = "Hint: maximum area values of 0 or 1 will be irgnored (no area constraints are set" +
|
||||
").";
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.ForeColor = System.Drawing.Color.White;
|
||||
this.label5.Location = new System.Drawing.Point(8, 43);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(87, 13);
|
||||
this.label5.TabIndex = 14;
|
||||
this.label5.Text = "Minimum angle";
|
||||
//
|
||||
// slMaxArea
|
||||
//
|
||||
this.slMaxArea.BackColor = System.Drawing.Color.Transparent;
|
||||
this.slMaxArea.CriticalPercent = ((uint)(0u));
|
||||
this.slMaxArea.Location = new System.Drawing.Point(102, 62);
|
||||
this.slMaxArea.Maximum = 100;
|
||||
this.slMaxArea.Minimum = 0;
|
||||
this.slMaxArea.Name = "slMaxArea";
|
||||
this.slMaxArea.Size = new System.Drawing.Size(119, 18);
|
||||
this.slMaxArea.TabIndex = 13;
|
||||
this.slMaxArea.Text = "darkSlider1";
|
||||
this.slMaxArea.Value = 0;
|
||||
this.slMaxArea.ValueChanging += new System.EventHandler(this.slMaxArea_ValueChanging);
|
||||
//
|
||||
// slMinAngle
|
||||
//
|
||||
this.slMinAngle.BackColor = System.Drawing.Color.Transparent;
|
||||
this.slMinAngle.CriticalPercent = ((uint)(89u));
|
||||
this.slMinAngle.Location = new System.Drawing.Point(102, 40);
|
||||
this.slMinAngle.Maximum = 100;
|
||||
this.slMinAngle.Minimum = 0;
|
||||
this.slMinAngle.Name = "slMinAngle";
|
||||
this.slMinAngle.Size = new System.Drawing.Size(119, 18);
|
||||
this.slMinAngle.TabIndex = 13;
|
||||
this.slMinAngle.Text = "darkSlider1";
|
||||
this.slMinAngle.Value = 50;
|
||||
this.slMinAngle.ValueChanging += new System.EventHandler(this.slMinAngle_ValueChanging);
|
||||
//
|
||||
// cbConformDel
|
||||
//
|
||||
this.cbConformDel.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbConformDel.Checked = false;
|
||||
this.cbConformDel.Location = new System.Drawing.Point(11, 132);
|
||||
this.cbConformDel.Name = "cbConformDel";
|
||||
this.cbConformDel.Size = new System.Drawing.Size(142, 17);
|
||||
this.cbConformDel.TabIndex = 0;
|
||||
this.cbConformDel.Text = "Conforming Delaunay";
|
||||
this.cbConformDel.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// cbConvex
|
||||
//
|
||||
this.cbConvex.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbConvex.Checked = false;
|
||||
this.cbConvex.Location = new System.Drawing.Point(11, 196);
|
||||
this.cbConvex.Name = "cbConvex";
|
||||
this.cbConvex.Size = new System.Drawing.Size(115, 17);
|
||||
this.cbConvex.TabIndex = 0;
|
||||
this.cbConvex.Text = "Convex mesh";
|
||||
this.cbConvex.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// cbQuality
|
||||
//
|
||||
this.cbQuality.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbQuality.Checked = false;
|
||||
this.cbQuality.Location = new System.Drawing.Point(11, 17);
|
||||
this.cbQuality.Name = "cbQuality";
|
||||
this.cbQuality.Size = new System.Drawing.Size(115, 17);
|
||||
this.cbQuality.TabIndex = 0;
|
||||
this.cbQuality.Text = "Quality mesh";
|
||||
this.cbQuality.UseVisualStyleBackColor = false;
|
||||
this.meshControlView.BackColor = System.Drawing.Color.DimGray;
|
||||
this.meshControlView.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.meshControlView.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.meshControlView.Location = new System.Drawing.Point(0, 0);
|
||||
this.meshControlView.Name = "meshControlView";
|
||||
this.meshControlView.Size = new System.Drawing.Size(272, 509);
|
||||
this.meshControlView.TabIndex = 0;
|
||||
//
|
||||
// tabPage2
|
||||
//
|
||||
this.tabPage2.BackColor = System.Drawing.Color.DimGray;
|
||||
this.tabPage2.Controls.Add(this.label20);
|
||||
this.tabPage2.Controls.Add(this.label4);
|
||||
this.tabPage2.Controls.Add(this.label3);
|
||||
this.tabPage2.Controls.Add(this.label2);
|
||||
this.tabPage2.Controls.Add(this.lbNumSeg);
|
||||
this.tabPage2.Controls.Add(this.lbNumSeg2);
|
||||
this.tabPage2.Controls.Add(this.lbNumTri);
|
||||
this.tabPage2.Controls.Add(this.lbNumTri2);
|
||||
this.tabPage2.Controls.Add(this.lbNumVert);
|
||||
this.tabPage2.Controls.Add(this.lbNumVert2);
|
||||
this.tabPage2.Controls.Add(this.label32);
|
||||
this.tabPage2.Controls.Add(this.label13);
|
||||
this.tabPage2.Controls.Add(this.label31);
|
||||
this.tabPage2.Controls.Add(this.label12);
|
||||
this.tabPage2.Controls.Add(this.label16);
|
||||
this.tabPage2.Controls.Add(this.label29);
|
||||
this.tabPage2.Controls.Add(this.label14);
|
||||
this.tabPage2.Controls.Add(this.lbAngleMax);
|
||||
this.tabPage2.Controls.Add(this.lbQualAspectAve);
|
||||
this.tabPage2.Controls.Add(this.lbEdgeMax);
|
||||
this.tabPage2.Controls.Add(this.lbQualAlphaAve);
|
||||
this.tabPage2.Controls.Add(this.lbAreaMax);
|
||||
this.tabPage2.Controls.Add(this.lbAngleMin);
|
||||
this.tabPage2.Controls.Add(this.lbQualAspectMin);
|
||||
this.tabPage2.Controls.Add(this.lbEdgeMin);
|
||||
this.tabPage2.Controls.Add(this.lbQualAlphaMin);
|
||||
this.tabPage2.Controls.Add(this.lbAreaMin);
|
||||
this.tabPage2.Controls.Add(this.label22);
|
||||
this.tabPage2.Controls.Add(this.label10);
|
||||
this.tabPage2.Controls.Add(this.label17);
|
||||
this.tabPage2.Controls.Add(this.label21);
|
||||
this.tabPage2.Controls.Add(this.label11);
|
||||
this.tabPage2.Controls.Add(this.angleHistogram1);
|
||||
this.tabPage2.Controls.Add(this.statisticView);
|
||||
this.tabPage2.ForeColor = System.Drawing.Color.White;
|
||||
this.tabPage2.Location = new System.Drawing.Point(4, 4);
|
||||
this.tabPage2.Name = "tabPage2";
|
||||
@@ -364,350 +146,20 @@
|
||||
this.tabPage2.TabIndex = 1;
|
||||
this.tabPage2.Text = "Statistic";
|
||||
//
|
||||
// label20
|
||||
//
|
||||
this.label20.AutoSize = true;
|
||||
this.label20.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label20.ForeColor = System.Drawing.Color.White;
|
||||
this.label20.Location = new System.Drawing.Point(8, 17);
|
||||
this.label20.Name = "label20";
|
||||
this.label20.Size = new System.Drawing.Size(39, 13);
|
||||
this.label20.TabIndex = 26;
|
||||
this.label20.Text = "Mesh:";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label4.Location = new System.Drawing.Point(8, 57);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(60, 13);
|
||||
this.label4.TabIndex = 23;
|
||||
this.label4.Text = "Segments:";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label3.Location = new System.Drawing.Point(8, 76);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(56, 13);
|
||||
this.label3.TabIndex = 24;
|
||||
this.label3.Text = "Triangles:";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label2.Location = new System.Drawing.Point(8, 38);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(50, 13);
|
||||
this.label2.TabIndex = 25;
|
||||
this.label2.Text = "Vertices:";
|
||||
//
|
||||
// lbNumSeg
|
||||
//
|
||||
this.lbNumSeg.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumSeg.Location = new System.Drawing.Point(98, 57);
|
||||
this.lbNumSeg.Name = "lbNumSeg";
|
||||
this.lbNumSeg.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumSeg.TabIndex = 20;
|
||||
this.lbNumSeg.Text = "-";
|
||||
this.lbNumSeg.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumSeg2
|
||||
//
|
||||
this.lbNumSeg2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumSeg2.Location = new System.Drawing.Point(188, 57);
|
||||
this.lbNumSeg2.Name = "lbNumSeg2";
|
||||
this.lbNumSeg2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumSeg2.TabIndex = 19;
|
||||
this.lbNumSeg2.Text = "-";
|
||||
this.lbNumSeg2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumTri
|
||||
//
|
||||
this.lbNumTri.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumTri.Location = new System.Drawing.Point(98, 76);
|
||||
this.lbNumTri.Name = "lbNumTri";
|
||||
this.lbNumTri.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumTri.TabIndex = 17;
|
||||
this.lbNumTri.Text = "-";
|
||||
this.lbNumTri.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumTri2
|
||||
//
|
||||
this.lbNumTri2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumTri2.Location = new System.Drawing.Point(188, 76);
|
||||
this.lbNumTri2.Name = "lbNumTri2";
|
||||
this.lbNumTri2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumTri2.TabIndex = 18;
|
||||
this.lbNumTri2.Text = "-";
|
||||
this.lbNumTri2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumVert
|
||||
//
|
||||
this.lbNumVert.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumVert.Location = new System.Drawing.Point(98, 38);
|
||||
this.lbNumVert.Name = "lbNumVert";
|
||||
this.lbNumVert.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumVert.TabIndex = 21;
|
||||
this.lbNumVert.Text = "-";
|
||||
this.lbNumVert.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumVert2
|
||||
//
|
||||
this.lbNumVert2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumVert2.Location = new System.Drawing.Point(188, 38);
|
||||
this.lbNumVert2.Name = "lbNumVert2";
|
||||
this.lbNumVert2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumVert2.TabIndex = 22;
|
||||
this.lbNumVert2.Text = "-";
|
||||
this.lbNumVert2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// label32
|
||||
//
|
||||
this.label32.AutoSize = true;
|
||||
this.label32.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label32.Location = new System.Drawing.Point(210, 213);
|
||||
this.label32.Name = "label32";
|
||||
this.label32.Size = new System.Drawing.Size(48, 13);
|
||||
this.label32.TabIndex = 11;
|
||||
this.label32.Text = "Average";
|
||||
//
|
||||
// label13
|
||||
//
|
||||
this.label13.AutoSize = true;
|
||||
this.label13.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label13.Location = new System.Drawing.Point(202, 114);
|
||||
this.label13.Name = "label13";
|
||||
this.label13.Size = new System.Drawing.Size(56, 13);
|
||||
this.label13.TabIndex = 11;
|
||||
this.label13.Text = "Maximum";
|
||||
//
|
||||
// label31
|
||||
//
|
||||
this.label31.AutoSize = true;
|
||||
this.label31.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label31.Location = new System.Drawing.Point(112, 213);
|
||||
this.label31.Name = "label31";
|
||||
this.label31.Size = new System.Drawing.Size(55, 13);
|
||||
this.label31.TabIndex = 12;
|
||||
this.label31.Text = "Minimum";
|
||||
//
|
||||
// label12
|
||||
//
|
||||
this.label12.AutoSize = true;
|
||||
this.label12.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label12.Location = new System.Drawing.Point(113, 114);
|
||||
this.label12.Name = "label12";
|
||||
this.label12.Size = new System.Drawing.Size(55, 13);
|
||||
this.label12.TabIndex = 12;
|
||||
this.label12.Text = "Minimum";
|
||||
//
|
||||
// label16
|
||||
//
|
||||
this.label16.AutoSize = true;
|
||||
this.label16.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label16.Location = new System.Drawing.Point(8, 173);
|
||||
this.label16.Name = "label16";
|
||||
this.label16.Size = new System.Drawing.Size(40, 13);
|
||||
this.label16.TabIndex = 9;
|
||||
this.label16.Text = "Angle:";
|
||||
//
|
||||
// label29
|
||||
//
|
||||
this.label29.AutoSize = true;
|
||||
this.label29.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label29.Location = new System.Drawing.Point(8, 253);
|
||||
this.label29.Name = "label29";
|
||||
this.label29.Size = new System.Drawing.Size(71, 13);
|
||||
this.label29.TabIndex = 15;
|
||||
this.label29.Text = "Aspect ratio:";
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label14.Location = new System.Drawing.Point(8, 154);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(73, 13);
|
||||
this.label14.TabIndex = 15;
|
||||
this.label14.Text = "Edge length:";
|
||||
//
|
||||
// lbAngleMax
|
||||
//
|
||||
this.lbAngleMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAngleMax.Location = new System.Drawing.Point(182, 173);
|
||||
this.lbAngleMax.Name = "lbAngleMax";
|
||||
this.lbAngleMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbAngleMax.TabIndex = 16;
|
||||
this.lbAngleMax.Text = "-";
|
||||
this.lbAngleMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAspectAve
|
||||
//
|
||||
this.lbQualAspectAve.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAspectAve.Location = new System.Drawing.Point(182, 253);
|
||||
this.lbQualAspectAve.Name = "lbQualAspectAve";
|
||||
this.lbQualAspectAve.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbQualAspectAve.TabIndex = 14;
|
||||
this.lbQualAspectAve.Text = "-";
|
||||
this.lbQualAspectAve.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbEdgeMax
|
||||
//
|
||||
this.lbEdgeMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbEdgeMax.Location = new System.Drawing.Point(182, 154);
|
||||
this.lbEdgeMax.Name = "lbEdgeMax";
|
||||
this.lbEdgeMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbEdgeMax.TabIndex = 14;
|
||||
this.lbEdgeMax.Text = "-";
|
||||
this.lbEdgeMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAlphaAve
|
||||
//
|
||||
this.lbQualAlphaAve.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAlphaAve.Location = new System.Drawing.Point(182, 234);
|
||||
this.lbQualAlphaAve.Name = "lbQualAlphaAve";
|
||||
this.lbQualAlphaAve.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbQualAlphaAve.TabIndex = 3;
|
||||
this.lbQualAlphaAve.Text = "-";
|
||||
this.lbQualAlphaAve.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAreaMax
|
||||
//
|
||||
this.lbAreaMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAreaMax.Location = new System.Drawing.Point(182, 135);
|
||||
this.lbAreaMax.Name = "lbAreaMax";
|
||||
this.lbAreaMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbAreaMax.TabIndex = 3;
|
||||
this.lbAreaMax.Text = "-";
|
||||
this.lbAreaMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAngleMin
|
||||
//
|
||||
this.lbAngleMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAngleMin.Location = new System.Drawing.Point(100, 173);
|
||||
this.lbAngleMin.Name = "lbAngleMin";
|
||||
this.lbAngleMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbAngleMin.TabIndex = 4;
|
||||
this.lbAngleMin.Text = "-";
|
||||
this.lbAngleMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAspectMin
|
||||
//
|
||||
this.lbQualAspectMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAspectMin.Location = new System.Drawing.Point(100, 253);
|
||||
this.lbQualAspectMin.Name = "lbQualAspectMin";
|
||||
this.lbQualAspectMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbQualAspectMin.TabIndex = 2;
|
||||
this.lbQualAspectMin.Text = "-";
|
||||
this.lbQualAspectMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbEdgeMin
|
||||
//
|
||||
this.lbEdgeMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbEdgeMin.Location = new System.Drawing.Point(100, 154);
|
||||
this.lbEdgeMin.Name = "lbEdgeMin";
|
||||
this.lbEdgeMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbEdgeMin.TabIndex = 2;
|
||||
this.lbEdgeMin.Text = "-";
|
||||
this.lbEdgeMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAlphaMin
|
||||
//
|
||||
this.lbQualAlphaMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAlphaMin.Location = new System.Drawing.Point(100, 234);
|
||||
this.lbQualAlphaMin.Name = "lbQualAlphaMin";
|
||||
this.lbQualAlphaMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbQualAlphaMin.TabIndex = 7;
|
||||
this.lbQualAlphaMin.Text = "-";
|
||||
this.lbQualAlphaMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAreaMin
|
||||
//
|
||||
this.lbAreaMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAreaMin.Location = new System.Drawing.Point(100, 135);
|
||||
this.lbAreaMin.Name = "lbAreaMin";
|
||||
this.lbAreaMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbAreaMin.TabIndex = 7;
|
||||
this.lbAreaMin.Text = "-";
|
||||
this.lbAreaMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// label22
|
||||
//
|
||||
this.label22.AutoSize = true;
|
||||
this.label22.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label22.Location = new System.Drawing.Point(8, 234);
|
||||
this.label22.Name = "label22";
|
||||
this.label22.Size = new System.Drawing.Size(65, 13);
|
||||
this.label22.TabIndex = 8;
|
||||
this.label22.Text = "Min. angle:";
|
||||
//
|
||||
// label10
|
||||
//
|
||||
this.label10.AutoSize = true;
|
||||
this.label10.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label10.Location = new System.Drawing.Point(8, 135);
|
||||
this.label10.Name = "label10";
|
||||
this.label10.Size = new System.Drawing.Size(76, 13);
|
||||
this.label10.TabIndex = 8;
|
||||
this.label10.Text = "Triangle area:";
|
||||
//
|
||||
// label17
|
||||
//
|
||||
this.label17.AutoSize = true;
|
||||
this.label17.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label17.ForeColor = System.Drawing.Color.White;
|
||||
this.label17.Location = new System.Drawing.Point(8, 290);
|
||||
this.label17.Name = "label17";
|
||||
this.label17.Size = new System.Drawing.Size(97, 13);
|
||||
this.label17.TabIndex = 5;
|
||||
this.label17.Text = "Angle histogram:";
|
||||
//
|
||||
// label21
|
||||
//
|
||||
this.label21.AutoSize = true;
|
||||
this.label21.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label21.ForeColor = System.Drawing.Color.White;
|
||||
this.label21.Location = new System.Drawing.Point(8, 213);
|
||||
this.label21.Name = "label21";
|
||||
this.label21.Size = new System.Drawing.Size(47, 13);
|
||||
this.label21.TabIndex = 6;
|
||||
this.label21.Text = "Quality:";
|
||||
//
|
||||
// label11
|
||||
//
|
||||
this.label11.AutoSize = true;
|
||||
this.label11.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label11.ForeColor = System.Drawing.Color.White;
|
||||
this.label11.Location = new System.Drawing.Point(8, 114);
|
||||
this.label11.Name = "label11";
|
||||
this.label11.Size = new System.Drawing.Size(50, 13);
|
||||
this.label11.TabIndex = 6;
|
||||
this.label11.Text = "Statistic:";
|
||||
//
|
||||
// angleHistogram1
|
||||
//
|
||||
this.angleHistogram1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(76)))), ((int)(((byte)(76)))));
|
||||
this.angleHistogram1.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.angleHistogram1.Location = new System.Drawing.Point(6, 308);
|
||||
this.angleHistogram1.Name = "angleHistogram1";
|
||||
this.angleHistogram1.Size = new System.Drawing.Size(260, 195);
|
||||
this.angleHistogram1.TabIndex = 0;
|
||||
this.angleHistogram1.Text = "angleHistogram1";
|
||||
// statisticView
|
||||
//
|
||||
this.statisticView.BackColor = System.Drawing.Color.DimGray;
|
||||
this.statisticView.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.statisticView.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.statisticView.Location = new System.Drawing.Point(0, 0);
|
||||
this.statisticView.Name = "statisticView";
|
||||
this.statisticView.Size = new System.Drawing.Size(272, 509);
|
||||
this.statisticView.TabIndex = 0;
|
||||
//
|
||||
// tabPage3
|
||||
//
|
||||
this.tabPage3.BackColor = System.Drawing.Color.DimGray;
|
||||
this.tabPage3.Controls.Add(this.lbCodeplex);
|
||||
this.tabPage3.Controls.Add(this.label15);
|
||||
this.tabPage3.Controls.Add(this.label1);
|
||||
this.tabPage3.Controls.Add(this.label19);
|
||||
this.tabPage3.Controls.Add(this.label18);
|
||||
this.tabPage3.Controls.Add(this.label7);
|
||||
this.tabPage3.Controls.Add(this.lbShortcuts);
|
||||
this.tabPage3.Controls.Add(this.aboutView);
|
||||
this.tabPage3.Location = new System.Drawing.Point(4, 4);
|
||||
this.tabPage3.Name = "tabPage3";
|
||||
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
|
||||
@@ -715,79 +167,15 @@
|
||||
this.tabPage3.TabIndex = 2;
|
||||
this.tabPage3.Text = "About";
|
||||
//
|
||||
// lbCodeplex
|
||||
// aboutView
|
||||
//
|
||||
this.lbCodeplex.AutoSize = true;
|
||||
this.lbCodeplex.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lbCodeplex.ForeColor = System.Drawing.Color.White;
|
||||
this.lbCodeplex.Location = new System.Drawing.Point(70, 82);
|
||||
this.lbCodeplex.Name = "lbCodeplex";
|
||||
this.lbCodeplex.Size = new System.Drawing.Size(153, 13);
|
||||
this.lbCodeplex.TabIndex = 2;
|
||||
this.lbCodeplex.Text = "http://triangle.codeplex.com";
|
||||
this.lbCodeplex.Click += new System.EventHandler(this.lbCodeplex_Clicked);
|
||||
//
|
||||
// label15
|
||||
//
|
||||
this.label15.AutoSize = true;
|
||||
this.label15.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label15.ForeColor = System.Drawing.Color.White;
|
||||
this.label15.Location = new System.Drawing.Point(8, 17);
|
||||
this.label15.Name = "label15";
|
||||
this.label15.Size = new System.Drawing.Size(73, 13);
|
||||
this.label15.TabIndex = 1;
|
||||
this.label15.Text = "Triangle.NET";
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label1.ForeColor = System.Drawing.Color.White;
|
||||
this.label1.Location = new System.Drawing.Point(8, 132);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(108, 13);
|
||||
this.label1.TabIndex = 1;
|
||||
this.label1.Text = "Keyboard shortcuts";
|
||||
//
|
||||
// label19
|
||||
//
|
||||
this.label19.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label19.ForeColor = System.Drawing.Color.White;
|
||||
this.label19.Location = new System.Drawing.Point(70, 42);
|
||||
this.label19.Name = "label19";
|
||||
this.label19.Size = new System.Drawing.Size(134, 40);
|
||||
this.label19.TabIndex = 0;
|
||||
this.label19.Text = "Beta 2 (2012-07-30)\r\nChristian Woltering\r\nMIT";
|
||||
//
|
||||
// label18
|
||||
//
|
||||
this.label18.ForeColor = System.Drawing.Color.White;
|
||||
this.label18.Location = new System.Drawing.Point(13, 42);
|
||||
this.label18.Name = "label18";
|
||||
this.label18.Size = new System.Drawing.Size(51, 40);
|
||||
this.label18.TabIndex = 0;
|
||||
this.label18.Text = "Version:\r\nAuthor:\r\nLicense:";
|
||||
this.label18.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label7.ForeColor = System.Drawing.Color.White;
|
||||
this.label7.Location = new System.Drawing.Point(70, 155);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(134, 108);
|
||||
this.label7.TabIndex = 0;
|
||||
this.label7.Text = "File Open\r\nFile Save\r\nReload Input\r\n\r\nTriangulate / Refine\r\nSmooth\r\n\r\nShow Log";
|
||||
//
|
||||
// lbShortcuts
|
||||
//
|
||||
this.lbShortcuts.ForeColor = System.Drawing.Color.White;
|
||||
this.lbShortcuts.Location = new System.Drawing.Point(22, 155);
|
||||
this.lbShortcuts.Name = "lbShortcuts";
|
||||
this.lbShortcuts.Size = new System.Drawing.Size(36, 108);
|
||||
this.lbShortcuts.TabIndex = 0;
|
||||
this.lbShortcuts.Text = "F3\r\nF4\r\nF5\r\n\r\nF8\r\nF9\r\n\r\nF12";
|
||||
this.lbShortcuts.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
this.aboutView.BackColor = System.Drawing.Color.DimGray;
|
||||
this.aboutView.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.aboutView.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.aboutView.Location = new System.Drawing.Point(0, 0);
|
||||
this.aboutView.Name = "aboutView";
|
||||
this.aboutView.Size = new System.Drawing.Size(272, 509);
|
||||
this.aboutView.TabIndex = 0;
|
||||
//
|
||||
// menuStrip1
|
||||
//
|
||||
@@ -925,6 +313,7 @@
|
||||
//
|
||||
// menuToolsRcm
|
||||
//
|
||||
this.menuToolsRcm.Enabled = false;
|
||||
this.menuToolsRcm.Name = "menuToolsRcm";
|
||||
this.menuToolsRcm.Size = new System.Drawing.Size(195, 22);
|
||||
this.menuToolsRcm.Text = "Renumber nodes (RCM)";
|
||||
@@ -941,20 +330,9 @@
|
||||
this.btnMesh.UseVisualStyleBackColor = true;
|
||||
this.btnMesh.Click += new System.EventHandler(this.btnMesh_Click);
|
||||
//
|
||||
// renderControl1
|
||||
//
|
||||
this.renderControl1.BackColor = System.Drawing.Color.Black;
|
||||
this.renderControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.renderControl1.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.renderControl1.Location = new System.Drawing.Point(0, 0);
|
||||
this.renderControl1.Name = "renderControl1";
|
||||
this.renderControl1.ShowVoronoi = false;
|
||||
this.renderControl1.Size = new System.Drawing.Size(703, 612);
|
||||
this.renderControl1.TabIndex = 0;
|
||||
this.renderControl1.Text = "meshRenderer1";
|
||||
//
|
||||
// FormMain
|
||||
//
|
||||
this.AllowDrop = true;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(76)))), ((int)(((byte)(76)))));
|
||||
@@ -969,20 +347,18 @@
|
||||
this.Load += new System.EventHandler(this.Form1_Load);
|
||||
this.ResizeBegin += new System.EventHandler(this.ResizeBeginHandler);
|
||||
this.ResizeEnd += new System.EventHandler(this.ResizeEndHandler);
|
||||
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.frmDragDrop);
|
||||
this.DragOver += new System.Windows.Forms.DragEventHandler(this.frmDragOver);
|
||||
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
|
||||
this.Resize += new System.EventHandler(this.ResizeHandler);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel1.PerformLayout();
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.flatTabControl1.ResumeLayout(false);
|
||||
this.tabPage1.ResumeLayout(false);
|
||||
this.tabPage1.PerformLayout();
|
||||
this.tabPage2.ResumeLayout(false);
|
||||
this.tabPage2.PerformLayout();
|
||||
this.tabPage3.ResumeLayout(false);
|
||||
this.tabPage3.PerformLayout();
|
||||
this.menuStrip1.ResumeLayout(false);
|
||||
this.menuStrip1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
@@ -992,7 +368,6 @@
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.SplitContainer splitContainer1;
|
||||
private Controls.RendererControl renderControl1;
|
||||
private System.Windows.Forms.MenuStrip menuStrip1;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuFile;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuFileOpen;
|
||||
@@ -1002,34 +377,7 @@
|
||||
private System.Windows.Forms.TabPage tabPage2;
|
||||
private Controls.DarkButton btnSmooth;
|
||||
private Controls.DarkButton btnMesh;
|
||||
private Controls.DarkCheckBox cbQuality;
|
||||
private Controls.AngleHistogram angleHistogram1;
|
||||
private Controls.DarkSlider slMinAngle;
|
||||
private System.Windows.Forms.TabPage tabPage3;
|
||||
private System.Windows.Forms.Label lbShortcuts;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private Controls.DarkCheckBox cbConvex;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private Controls.DarkSlider slMaxArea;
|
||||
private System.Windows.Forms.Label lbMaxArea;
|
||||
private System.Windows.Forms.Label lbMinAngle;
|
||||
private System.Windows.Forms.Label label9;
|
||||
private System.Windows.Forms.Label label8;
|
||||
private System.Windows.Forms.Label label13;
|
||||
private System.Windows.Forms.Label label12;
|
||||
private System.Windows.Forms.Label label16;
|
||||
private System.Windows.Forms.Label label14;
|
||||
private System.Windows.Forms.Label lbAngleMax;
|
||||
private System.Windows.Forms.Label lbEdgeMax;
|
||||
private System.Windows.Forms.Label lbAreaMax;
|
||||
private System.Windows.Forms.Label lbAngleMin;
|
||||
private System.Windows.Forms.Label lbEdgeMin;
|
||||
private System.Windows.Forms.Label lbAreaMin;
|
||||
private System.Windows.Forms.Label label10;
|
||||
private System.Windows.Forms.Label label17;
|
||||
private System.Windows.Forms.Label label11;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuView;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuViewVoronoi;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
|
||||
@@ -1039,35 +387,13 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem menuToolsCheck;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuFileQuit;
|
||||
private System.Windows.Forms.Label label15;
|
||||
private System.Windows.Forms.Label label19;
|
||||
private System.Windows.Forms.Label label18;
|
||||
private System.Windows.Forms.Label lbCodeplex;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuFileExport;
|
||||
private System.Windows.Forms.Label label32;
|
||||
private System.Windows.Forms.Label label31;
|
||||
private System.Windows.Forms.Label label29;
|
||||
private System.Windows.Forms.Label lbQualAspectAve;
|
||||
private System.Windows.Forms.Label lbQualAlphaAve;
|
||||
private System.Windows.Forms.Label lbQualAspectMin;
|
||||
private System.Windows.Forms.Label lbQualAlphaMin;
|
||||
private System.Windows.Forms.Label label22;
|
||||
private System.Windows.Forms.Label label21;
|
||||
private System.Windows.Forms.Label label20;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label lbNumSeg;
|
||||
private System.Windows.Forms.Label lbNumSeg2;
|
||||
private System.Windows.Forms.Label lbNumTri;
|
||||
private System.Windows.Forms.Label lbNumTri2;
|
||||
private System.Windows.Forms.Label lbNumVert;
|
||||
private System.Windows.Forms.Label lbNumVert2;
|
||||
private System.Windows.Forms.Label label23;
|
||||
private Controls.DarkCheckBox cbConformDel;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
|
||||
private System.Windows.Forms.ToolStripMenuItem menuToolsRcm;
|
||||
private Views.MeshControlView meshControlView;
|
||||
private Views.StatisticView statisticView;
|
||||
private Views.AboutView aboutView;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+235
-251
@@ -2,14 +2,13 @@
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using MeshExplorer.Controls;
|
||||
using MeshExplorer.IO;
|
||||
using MeshRenderer.Core;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Geometry;
|
||||
using TriangleNet.Tools;
|
||||
using MeshExplorer.Rendering;
|
||||
|
||||
namespace MeshExplorer
|
||||
{
|
||||
@@ -18,12 +17,13 @@ namespace MeshExplorer
|
||||
Settings settings;
|
||||
InputGeometry input;
|
||||
Mesh mesh;
|
||||
Statistic stats;
|
||||
QualityMeasure quality;
|
||||
|
||||
FormLog frmLog;
|
||||
FormGenerator frmGenerator;
|
||||
|
||||
RenderManager renderManager;
|
||||
RenderData renderData;
|
||||
|
||||
public FormMain()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -37,9 +37,47 @@ namespace MeshExplorer
|
||||
|
||||
settings = new Settings();
|
||||
|
||||
renderControl1.Initialize();
|
||||
renderManager = new RenderManager();
|
||||
renderManager.CreateDefaultControl();
|
||||
|
||||
stats = new Statistic();
|
||||
/*
|
||||
if (!renderManager.CreateControl("MeshRenderer.SharpGL2.dll", new string[] { "SharpGL.dll" }))
|
||||
{
|
||||
renderManager.CreateDefaultControl();
|
||||
|
||||
if (frmLog == null)
|
||||
{
|
||||
frmLog = new FormLog();
|
||||
}
|
||||
|
||||
frmLog.AddItem("Failed to initialize OpenGL.", true);
|
||||
}
|
||||
*/
|
||||
|
||||
var control = renderManager.RenderControl;
|
||||
|
||||
if (control != null)
|
||||
{
|
||||
this.splitContainer1.Panel2.Controls.Add(control);
|
||||
|
||||
// Initialize control
|
||||
control.BackColor = Color.Black;
|
||||
control.Dock = DockStyle.Fill;
|
||||
control.Font = new Font("Consolas", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
|
||||
control.Location = new System.Drawing.Point(0, 0);
|
||||
control.Name = "renderControl1";
|
||||
control.Size = new Size(703, 612);
|
||||
control.TabIndex = 0;
|
||||
control.Text = "meshRenderer1";
|
||||
|
||||
renderManager.Initialize();
|
||||
}
|
||||
else
|
||||
{
|
||||
DarkMessageBox.Show("Ooops ...", "Failed to initialize renderer.");
|
||||
}
|
||||
|
||||
renderData = new RenderData();
|
||||
}
|
||||
|
||||
private void Form1_KeyUp(object sender, KeyEventArgs e)
|
||||
@@ -47,7 +85,7 @@ namespace MeshExplorer
|
||||
switch (e.KeyCode)
|
||||
{
|
||||
case Keys.F3:
|
||||
Open();
|
||||
OpenWithDialog();
|
||||
break;
|
||||
case Keys.F4:
|
||||
Save();
|
||||
@@ -88,39 +126,57 @@ namespace MeshExplorer
|
||||
Smooth();
|
||||
}
|
||||
|
||||
private void lbCodeplex_Clicked(object sender, EventArgs e)
|
||||
#region Drag and drop
|
||||
|
||||
private void frmDragDrop(object sender, DragEventArgs e)
|
||||
{
|
||||
try
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
{
|
||||
ProcessStartInfo sInfo = new ProcessStartInfo("http://triangle.codeplex.com/");
|
||||
Process.Start(sInfo);
|
||||
string[] args = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
|
||||
Open(args[0]);
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
}
|
||||
|
||||
private void slMinAngle_ValueChanging(object sender, EventArgs e)
|
||||
private void frmDragOver(object sender, DragEventArgs e)
|
||||
{
|
||||
// Between 0 and 40 (step 1)
|
||||
int angle = (slMinAngle.Value * 40) / 100;
|
||||
lbMinAngle.Text = angle.ToString();
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
{
|
||||
string[] args = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
|
||||
if (args.Length > 1)
|
||||
{
|
||||
e.Effect = DragDropEffects.None;
|
||||
return;
|
||||
}
|
||||
|
||||
string file = args[0].ToLower();
|
||||
|
||||
// Check if file extension is known
|
||||
if (FileProcessor.CanHandleFile(file))
|
||||
{
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
e.Effect = DragDropEffects.None;
|
||||
}
|
||||
}
|
||||
|
||||
private void slMaxArea_ValueChanging(object sender, EventArgs e)
|
||||
{
|
||||
// Between 0 and 1 (step 0.01)
|
||||
double area = slMaxArea.Value * 0.01;
|
||||
lbMaxArea.Text = area.ToString(Util.Nfi);
|
||||
}
|
||||
#endregion
|
||||
|
||||
protected override void OnMouseWheel(MouseEventArgs e)
|
||||
{
|
||||
var container = this.splitContainer1.Panel2.ClientRectangle;
|
||||
|
||||
System.Drawing.Point pt = e.Location;
|
||||
pt.Offset(-splitContainer1.SplitterDistance, 0);
|
||||
|
||||
if (renderControl1.ClientRectangle.Contains(pt))
|
||||
if (container.Contains(pt))
|
||||
{
|
||||
renderControl1.Zoom(pt, e.Delta);
|
||||
renderManager.Zoom(((float)pt.X) / container.Width,
|
||||
((float)pt.Y) / container.Height, e.Delta);
|
||||
}
|
||||
base.OnMouseWheel(e);
|
||||
}
|
||||
@@ -135,7 +191,7 @@ namespace MeshExplorer
|
||||
// Handle window minimize and maximize
|
||||
if (!isResizing)
|
||||
{
|
||||
renderControl1.HandleResize();
|
||||
renderManager.HandleResize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +202,7 @@ namespace MeshExplorer
|
||||
if (this.ClientSize != this.oldClientSize)
|
||||
{
|
||||
this.oldClientSize = this.ClientSize;
|
||||
renderControl1.HandleResize();
|
||||
renderManager.HandleResize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,132 +224,45 @@ namespace MeshExplorer
|
||||
settings.RefineMode = false;
|
||||
settings.ExceptionThrown = false;
|
||||
|
||||
// Reset labels
|
||||
lbNumVert2.Text = "-";
|
||||
lbNumTri2.Text = "-";
|
||||
lbNumSeg2.Text = "-";
|
||||
|
||||
lbNumVert.Text = input.Count.ToString();
|
||||
lbNumSeg.Text = input.Segments.Count().ToString();
|
||||
lbNumTri.Text = "0"; //input.Triangles == null ? "0" : input.Triangles.Length.ToString();
|
||||
|
||||
// Statistics labels
|
||||
lbAreaMin.Text = "-";
|
||||
lbAreaMax.Text = "-";
|
||||
lbEdgeMin.Text = "-";
|
||||
lbEdgeMax.Text = "-";
|
||||
lbAngleMin.Text = "-";
|
||||
lbAngleMax.Text = "-";
|
||||
|
||||
// Quality labels
|
||||
lbQualAlphaMin.Text = "-";
|
||||
lbQualAlphaAve.Text = "-";
|
||||
lbQualAspectMin.Text = "-";
|
||||
lbQualAspectAve.Text = "-";
|
||||
|
||||
angleHistogram1.SetData(null, null);
|
||||
|
||||
// Reset buttons
|
||||
btnMesh.Enabled = true;
|
||||
btnMesh.Text = "Triangulate";
|
||||
btnSmooth.Enabled = false;
|
||||
|
||||
// Update Statistic view
|
||||
statisticView.HandleNewInput(input);
|
||||
|
||||
// Clear voronoi
|
||||
menuViewVoronoi.Checked = false;
|
||||
renderControl1.ShowVoronoi = false;
|
||||
//renderManager.ShowVoronoi = false;
|
||||
|
||||
// Disable menu items
|
||||
menuFileSave.Enabled = false;
|
||||
menuFileExport.Enabled = false;
|
||||
menuViewVoronoi.Enabled = false;
|
||||
menuToolsCheck.Enabled = false;
|
||||
menuToolsRcm.Enabled = false;
|
||||
|
||||
// Render input
|
||||
renderControl1.SetData(input);
|
||||
renderData.SetInputGeometry(input);
|
||||
renderManager.SetData(renderData);
|
||||
|
||||
// Update window caption
|
||||
this.Text = "Triangle.NET - Mesh Explorer - " + settings.CurrentFile;
|
||||
}
|
||||
|
||||
private void HandleMeshChange()
|
||||
{
|
||||
// Render mesh
|
||||
renderControl1.SetData(mesh);
|
||||
|
||||
// Previous mesh stats
|
||||
lbNumVert2.Text = lbNumVert.Text;
|
||||
lbNumTri2.Text = lbNumTri.Text;
|
||||
lbNumSeg2.Text = lbNumSeg.Text;
|
||||
|
||||
// New mesh stats
|
||||
lbNumVert.Text = stats.Vertices.ToString();
|
||||
lbNumSeg.Text = stats.ConstrainedEdges.ToString();
|
||||
lbNumTri.Text = stats.Triangles.ToString();
|
||||
|
||||
// Update statistics tab
|
||||
angleHistogram1.SetData(stats.MinAngleHistogram, stats.MaxAngleHistogram);
|
||||
|
||||
lbAreaMin.Text = Util.DoubleToString(stats.SmallestArea);
|
||||
lbAreaMax.Text = Util.DoubleToString(stats.LargestArea);
|
||||
lbEdgeMin.Text = Util.DoubleToString(stats.ShortestEdge);
|
||||
lbEdgeMax.Text = Util.DoubleToString(stats.LongestEdge);
|
||||
lbAngleMin.Text = Util.AngleToString(stats.SmallestAngle);
|
||||
lbAngleMax.Text = Util.AngleToString(stats.LargestAngle);
|
||||
|
||||
// Enable menu items
|
||||
menuFileSave.Enabled = true;
|
||||
menuFileExport.Enabled = true;
|
||||
menuViewVoronoi.Enabled = true;
|
||||
menuToolsCheck.Enabled = true;
|
||||
|
||||
// Update quality
|
||||
if (quality == null)
|
||||
{
|
||||
quality = new QualityMeasure();
|
||||
}
|
||||
|
||||
quality.Update(this.mesh);
|
||||
|
||||
lbQualAlphaMin.Text = Util.DoubleToString(quality.AlphaMinimum);
|
||||
lbQualAlphaAve.Text = Util.DoubleToString(quality.AlphaAverage);
|
||||
|
||||
lbQualAspectMin.Text = Util.DoubleToString(quality.Q_Minimum);
|
||||
lbQualAspectAve.Text = Util.DoubleToString(quality.Q_Average);
|
||||
}
|
||||
|
||||
private void HandleMeshImport()
|
||||
{
|
||||
// Render mesh
|
||||
renderControl1.SetData(mesh, true);
|
||||
renderData.SetMesh(mesh);
|
||||
renderManager.SetData(renderData);
|
||||
//renderManager.Initialize();
|
||||
|
||||
// Update window caption
|
||||
this.Text = "Triangle.NET - Mesh Explorer - " + settings.CurrentFile;
|
||||
|
||||
// Previous mesh stats
|
||||
lbNumVert2.Text = "-";
|
||||
lbNumTri2.Text = "-";
|
||||
lbNumSeg2.Text = "-";
|
||||
|
||||
// New mesh stats
|
||||
lbNumVert.Text = stats.Vertices.ToString();
|
||||
lbNumSeg.Text = stats.ConstrainedEdges.ToString();
|
||||
lbNumTri.Text = stats.Triangles.ToString();
|
||||
|
||||
// Update statistics tab
|
||||
angleHistogram1.SetData(stats.MinAngleHistogram, stats.MaxAngleHistogram);
|
||||
|
||||
lbAreaMin.Text = Util.DoubleToString(stats.SmallestArea);
|
||||
lbAreaMax.Text = Util.DoubleToString(stats.LargestArea);
|
||||
lbEdgeMin.Text = Util.DoubleToString(stats.ShortestEdge);
|
||||
lbEdgeMax.Text = Util.DoubleToString(stats.LongestEdge);
|
||||
lbAngleMin.Text = Util.AngleToString(stats.SmallestAngle);
|
||||
lbAngleMax.Text = Util.AngleToString(stats.LargestAngle);
|
||||
|
||||
// Enable menu items
|
||||
menuFileSave.Enabled = true;
|
||||
menuFileExport.Enabled = true;
|
||||
menuViewVoronoi.Enabled = true;
|
||||
menuToolsCheck.Enabled = true;
|
||||
// Update Statistic view
|
||||
statisticView.HandleMeshImport(input, mesh);
|
||||
|
||||
// Set refine mode
|
||||
btnMesh.Enabled = true;
|
||||
@@ -301,26 +270,39 @@ namespace MeshExplorer
|
||||
|
||||
settings.RefineMode = true;
|
||||
|
||||
// Update quality
|
||||
if (quality == null)
|
||||
{
|
||||
quality = new QualityMeasure();
|
||||
}
|
||||
HandleMeshChange();
|
||||
}
|
||||
|
||||
quality.Update(this.mesh);
|
||||
private void HandleMeshUpdate()
|
||||
{
|
||||
// Render mesh
|
||||
renderData.SetMesh(mesh);
|
||||
renderManager.SetData(renderData);
|
||||
|
||||
lbQualAlphaMin.Text = Util.DoubleToString(quality.AlphaMinimum);
|
||||
lbQualAlphaAve.Text = Util.DoubleToString(quality.AlphaAverage);
|
||||
// Update Statistic view
|
||||
statisticView.HandleMeshUpdate(mesh);
|
||||
|
||||
lbQualAspectMin.Text = Util.DoubleToString(quality.Q_Minimum);
|
||||
lbQualAspectAve.Text = Util.DoubleToString(quality.Q_Average);
|
||||
HandleMeshChange();
|
||||
}
|
||||
|
||||
private void HandleMeshChange()
|
||||
{
|
||||
// Update Statistic view
|
||||
statisticView.HandleMeshChange(mesh);
|
||||
|
||||
// Enable menu items
|
||||
menuFileSave.Enabled = true;
|
||||
menuFileExport.Enabled = true;
|
||||
menuViewVoronoi.Enabled = true;
|
||||
menuToolsCheck.Enabled = true;
|
||||
menuToolsRcm.Enabled = true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
|
||||
private void Open()
|
||||
private void OpenWithDialog()
|
||||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
|
||||
@@ -331,51 +313,55 @@ namespace MeshExplorer
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
if (FileProcessor.ContainsMeshData(ofd.FileName))
|
||||
if (Open(ofd.FileName))
|
||||
{
|
||||
if (DarkMessageBox.Show("Import mesh", Settings.ImportString,
|
||||
"Do you want to import the mesh?", MessageBoxButtons.YesNo) == DialogResult.OK)
|
||||
{
|
||||
input = null;
|
||||
mesh = FileProcessor.Import(ofd.FileName);
|
||||
|
||||
if (mesh != null)
|
||||
{
|
||||
stats.Update(mesh, 10);
|
||||
|
||||
// Update settings
|
||||
settings.CurrentFile = Path.GetFileName(ofd.FileName);
|
||||
|
||||
HandleMeshImport();
|
||||
btnSmooth.Enabled = true; // TODO: Remove
|
||||
}
|
||||
// else Message
|
||||
|
||||
// Update folder settings
|
||||
settings.OfdFilterIndex = ofd.FilterIndex;
|
||||
settings.OfdDirectory = Path.GetDirectoryName(ofd.FileName);
|
||||
|
||||
return;
|
||||
}
|
||||
// Update folder settings
|
||||
settings.OfdFilterIndex = ofd.FilterIndex;
|
||||
settings.OfdDirectory = Path.GetDirectoryName(ofd.FileName);
|
||||
}
|
||||
|
||||
input = FileProcessor.Read(ofd.FileName);
|
||||
|
||||
if (input != null)
|
||||
{
|
||||
// Update settings
|
||||
settings.CurrentFile = Path.GetFileName(ofd.FileName);
|
||||
|
||||
HandleNewInput();
|
||||
}
|
||||
// else Message
|
||||
|
||||
// Update folder settings
|
||||
settings.OfdFilterIndex = ofd.FilterIndex;
|
||||
settings.OfdDirectory = Path.GetDirectoryName(ofd.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
private bool Open(string filename)
|
||||
{
|
||||
if (FileProcessor.ContainsMeshData(filename))
|
||||
{
|
||||
if (DarkMessageBox.Show("Import mesh", Settings.ImportString,
|
||||
"Do you want to import the mesh?", MessageBoxButtons.YesNo) == DialogResult.OK)
|
||||
{
|
||||
input = null;
|
||||
mesh = FileProcessor.Import(filename);
|
||||
|
||||
if (mesh != null)
|
||||
{
|
||||
statisticView.UpdateStatistic(mesh);
|
||||
|
||||
// Update settings
|
||||
settings.CurrentFile = Path.GetFileName(filename);
|
||||
|
||||
HandleMeshImport();
|
||||
btnSmooth.Enabled = true; // TODO: Remove
|
||||
}
|
||||
// else Message
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
input = FileProcessor.Read(filename);
|
||||
|
||||
if (input != null)
|
||||
{
|
||||
// Update settings
|
||||
settings.CurrentFile = Path.GetFileName(filename);
|
||||
|
||||
HandleNewInput();
|
||||
}
|
||||
// else Message
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void Save()
|
||||
{
|
||||
SaveFileDialog sfd = new SaveFileDialog();
|
||||
@@ -414,13 +400,13 @@ namespace MeshExplorer
|
||||
{
|
||||
Triangulate();
|
||||
|
||||
if (cbQuality.Checked)
|
||||
if (meshControlView.ParamQualityChecked)
|
||||
{
|
||||
btnMesh.Text = "Refine";
|
||||
//btnSmooth.Enabled = true;
|
||||
btnSmooth.Enabled = true;
|
||||
}
|
||||
}
|
||||
else if (cbQuality.Checked)
|
||||
else if (meshControlView.ParamQualityChecked)
|
||||
{
|
||||
Refine();
|
||||
}
|
||||
@@ -434,17 +420,16 @@ namespace MeshExplorer
|
||||
|
||||
mesh = new Mesh();
|
||||
|
||||
if (cbConformDel.Checked)
|
||||
if (meshControlView.ParamConformDelChecked)
|
||||
{
|
||||
mesh.SetOption(Options.ConformingDelaunay, true);
|
||||
}
|
||||
|
||||
if (cbQuality.Checked)
|
||||
if (meshControlView.ParamQualityChecked)
|
||||
{
|
||||
mesh.SetOption(Options.Quality, true);
|
||||
|
||||
int angle = (slMinAngle.Value * 40) / 100;
|
||||
mesh.SetOption(Options.MinAngle, angle);
|
||||
mesh.SetOption(Options.MinAngle, meshControlView.ParamMinAngleValue);
|
||||
|
||||
// Ignore area constraints on initial triangulation.
|
||||
|
||||
@@ -457,7 +442,7 @@ namespace MeshExplorer
|
||||
//}
|
||||
}
|
||||
|
||||
if (cbConvex.Checked)
|
||||
if (meshControlView.ParamConvexChecked)
|
||||
{
|
||||
mesh.SetOption(Options.Convex, true);
|
||||
}
|
||||
@@ -468,11 +453,11 @@ namespace MeshExplorer
|
||||
mesh.Triangulate(input);
|
||||
//sw.Stop();
|
||||
|
||||
stats.Update(mesh, 10);
|
||||
statisticView.UpdateStatistic(mesh);
|
||||
|
||||
HandleMeshChange();
|
||||
HandleMeshUpdate();
|
||||
|
||||
if (cbQuality.Checked)
|
||||
if (meshControlView.ParamQualityChecked)
|
||||
{
|
||||
settings.RefineMode = true;
|
||||
}
|
||||
@@ -492,15 +477,14 @@ namespace MeshExplorer
|
||||
|
||||
Stopwatch sw = new Stopwatch();
|
||||
|
||||
double area = slMaxArea.Value * 0.01;
|
||||
double area = meshControlView.ParamMaxAreaValue;
|
||||
|
||||
if (area > 0 && area < 1)
|
||||
{
|
||||
mesh.SetOption(Options.MaxArea, area * stats.LargestArea);
|
||||
mesh.SetOption(Options.MaxArea, area * statisticView.Statistic.LargestArea);
|
||||
}
|
||||
|
||||
int angle = (slMinAngle.Value * 40) / 100;
|
||||
mesh.SetOption(Options.MinAngle, angle);
|
||||
mesh.SetOption(Options.MinAngle, meshControlView.ParamMinAngleValue);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -508,9 +492,9 @@ namespace MeshExplorer
|
||||
mesh.Refine();
|
||||
sw.Stop();
|
||||
|
||||
stats.Update(mesh, 10);
|
||||
statisticView.UpdateStatistic(mesh);
|
||||
|
||||
HandleMeshChange();
|
||||
HandleMeshUpdate();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -546,7 +530,7 @@ namespace MeshExplorer
|
||||
mesh.Smooth();
|
||||
sw.Stop();
|
||||
|
||||
stats.Update(mesh, 10);
|
||||
statisticView.UpdateStatistic(mesh);
|
||||
|
||||
HandleMeshChange();
|
||||
}
|
||||
@@ -588,7 +572,7 @@ namespace MeshExplorer
|
||||
|
||||
private void menuFileOpen_Click(object sender, EventArgs e)
|
||||
{
|
||||
Open();
|
||||
OpenWithDialog();
|
||||
}
|
||||
|
||||
private void menuFileSave_Click(object sender, EventArgs ev)
|
||||
@@ -599,6 +583,59 @@ namespace MeshExplorer
|
||||
}
|
||||
}
|
||||
|
||||
private void menuFileExport_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (mesh != null)
|
||||
{
|
||||
FormExport export = new FormExport();
|
||||
|
||||
string file = settings.OfdDirectory;
|
||||
|
||||
if (!file.EndsWith("\\"))
|
||||
{
|
||||
file += "\\";
|
||||
}
|
||||
|
||||
file += settings.CurrentFile;
|
||||
|
||||
export.ImageName = Path.ChangeExtension(file, ".png");
|
||||
|
||||
if (export.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
int format = export.ImageFormat;
|
||||
int size = export.ImageSize;
|
||||
|
||||
if (format == 1)
|
||||
{
|
||||
EpsImage eps = new EpsImage();
|
||||
eps.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
else if (format == 2)
|
||||
{
|
||||
SvgImage svg = new SvgImage();
|
||||
svg.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
RasterImage img = new RasterImage();
|
||||
img.ColorScheme = ColorManager.LightScheme();
|
||||
img.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void menuFileQuit_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void menuViewVoronoi_Click(object sender, EventArgs e)
|
||||
{
|
||||
menuViewVoronoi.Checked = !menuViewVoronoi.Checked;
|
||||
//renderControl1.ShowVoronoi = menuViewVoronoi.Checked;
|
||||
}
|
||||
|
||||
private void menuViewLog_Click(object sender, EventArgs e)
|
||||
{
|
||||
ShowLog();
|
||||
@@ -636,64 +673,11 @@ namespace MeshExplorer
|
||||
}
|
||||
}
|
||||
|
||||
private void menuFileExport_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (mesh != null)
|
||||
{
|
||||
FormExport export = new FormExport();
|
||||
|
||||
string file = settings.OfdDirectory;
|
||||
|
||||
if (!file.EndsWith("\\"))
|
||||
{
|
||||
file += "\\";
|
||||
}
|
||||
|
||||
file += settings.CurrentFile;
|
||||
|
||||
export.ImageName = Path.ChangeExtension(file, ".png");
|
||||
|
||||
if (export.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
int format = export.ImageFormat;
|
||||
int size = export.ImageSize;
|
||||
|
||||
if (format == 1)
|
||||
{
|
||||
EpsImage eps = new EpsImage();
|
||||
eps.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
else if (format == 2)
|
||||
{
|
||||
SvgImage svg = new SvgImage();
|
||||
svg.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
RasterImage img = new RasterImage();
|
||||
img.ColorScheme = RenderColors.LightScheme();
|
||||
img.Export(this.mesh, export.ImageName, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void menuViewVoronoi_Click(object sender, EventArgs e)
|
||||
{
|
||||
menuViewVoronoi.Checked = !menuViewVoronoi.Checked;
|
||||
renderControl1.ShowVoronoi = menuViewVoronoi.Checked;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void menuFileQuit_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void menuToolsRcm_Click(object sender, EventArgs e)
|
||||
{
|
||||
Renumber();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,12 +91,24 @@ namespace MeshExplorer.Generators
|
||||
|
||||
InputGeometry input = new InputGeometry(numPoints);
|
||||
|
||||
double r, phi, radius = 100;
|
||||
int i = 0, cNum = 2 * (int)Math.Floor(Math.Sqrt(numPoints));
|
||||
|
||||
for (int i = 0; i < numPoints; i++)
|
||||
double r, phi, radius = 100, step = 2 * Math.PI / cNum;
|
||||
|
||||
// Distrubute points equally on circle border
|
||||
for (; i < cNum; i++)
|
||||
{
|
||||
// Add a little error
|
||||
r = Util.Random.NextDouble();
|
||||
|
||||
input.AddPoint((radius + r) * Math.Cos(i * step),
|
||||
(radius + r) * Math.Sin(i * step));
|
||||
}
|
||||
|
||||
for (; i < numPoints; i++)
|
||||
{
|
||||
// Use sqrt(rand) to get normal distribution right.
|
||||
r = Math.Pow(Util.Random.NextDouble(), exp) * radius;
|
||||
r = Math.Pow(Util.Random.NextDouble(), exp) * radius;
|
||||
phi = Util.Random.NextDouble() * Math.PI * 2;
|
||||
|
||||
input.AddPoint(r * Math.Cos(phi), r * Math.Sin(phi));
|
||||
|
||||
@@ -8,14 +8,11 @@
|
||||
namespace MeshExplorer.IO
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using MeshExplorer.Rendering;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Geometry;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Writes a mesh to an EPS file.
|
||||
|
||||
@@ -21,6 +21,21 @@ namespace MeshExplorer.IO
|
||||
{
|
||||
static Dictionary<string, IMeshFile> container = new Dictionary<string, IMeshFile>();
|
||||
|
||||
public static bool CanHandleFile(string path)
|
||||
{
|
||||
if (File.Exists(path))
|
||||
{
|
||||
var provider = GetProviderInstance(path);
|
||||
|
||||
if (provider != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true, if the given file contains mesh information.
|
||||
/// </summary>
|
||||
@@ -69,7 +84,7 @@ namespace MeshExplorer.IO
|
||||
{
|
||||
string ext = Path.GetExtension(path);
|
||||
|
||||
IMeshFile provider;
|
||||
IMeshFile provider = null;
|
||||
|
||||
if (container.ContainsKey(ext))
|
||||
{
|
||||
|
||||
@@ -7,16 +7,14 @@
|
||||
namespace MeshExplorer.IO.Formats
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet.IO;
|
||||
using System.IO;
|
||||
using MeshExplorer.Rendering;
|
||||
using TriangleNet.Geometry;
|
||||
using TriangleNet;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
using TriangleNet.IO;
|
||||
|
||||
/// <summary>
|
||||
/// Read and write JSON files.
|
||||
@@ -132,21 +130,21 @@ namespace MeshExplorer.IO.Formats
|
||||
if (ns > 0)
|
||||
{
|
||||
writer.Write(",");
|
||||
WriteSegments(mesh, writer, ns);
|
||||
WriteSegments(mesh.Segments, writer, ns);
|
||||
}
|
||||
|
||||
// Write the holes
|
||||
if (nh > 0)
|
||||
{
|
||||
writer.Write(",");
|
||||
WriteHoles(mesh, writer, nh);
|
||||
WriteHoles(mesh.Holes, writer, nh);
|
||||
}
|
||||
|
||||
// Write the elements
|
||||
if (ne > 0)
|
||||
{
|
||||
writer.Write(",");
|
||||
WriteTriangles(mesh, writer, ne);
|
||||
WriteTriangles(mesh.Triangles, writer, ne);
|
||||
}
|
||||
|
||||
writer.Write("}");
|
||||
@@ -413,7 +411,7 @@ namespace MeshExplorer.IO.Formats
|
||||
|
||||
if (mesh.CurrentNumbering == NodeNumbering.Linear)
|
||||
{
|
||||
markers = WritePoints(writer, mesh.Vertices, nv, useMarkers);
|
||||
markers = WritePoints(mesh.Vertices, writer, nv, useMarkers);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -424,7 +422,7 @@ namespace MeshExplorer.IO.Formats
|
||||
nodes[node.ID] = node;
|
||||
}
|
||||
|
||||
markers = WritePoints(writer, nodes, nv, useMarkers);
|
||||
markers = WritePoints(nodes, writer, nv, useMarkers);
|
||||
}
|
||||
|
||||
writer.Write("]");
|
||||
@@ -437,13 +435,13 @@ namespace MeshExplorer.IO.Formats
|
||||
writer.Write("}");
|
||||
}
|
||||
|
||||
private static StringBuilder WritePoints(StreamWriter writer, IEnumerable<Vertex> nodes, int nv, bool useMarkers)
|
||||
private static StringBuilder WritePoints(IEnumerable<Point> data, StreamWriter writer, int nv, bool useMarkers)
|
||||
{
|
||||
StringBuilder markers = new StringBuilder();
|
||||
|
||||
int i = 0;
|
||||
string seperator;
|
||||
foreach (var item in nodes)
|
||||
foreach (var item in data)
|
||||
{
|
||||
seperator = (i == nv - 1) ? String.Empty : ", ";
|
||||
|
||||
@@ -464,12 +462,12 @@ namespace MeshExplorer.IO.Formats
|
||||
return markers;
|
||||
}
|
||||
|
||||
private void WriteHoles(Mesh data, StreamWriter writer, int nh)
|
||||
private void WriteHoles(IEnumerable<Point> data, StreamWriter writer, int nh)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
writer.Write("\"holes\":[");
|
||||
foreach (var item in data.Holes)
|
||||
foreach (var item in data)
|
||||
{
|
||||
writer.Write("{0},{1}{2}",
|
||||
item.X.ToString(Util.Nfi),
|
||||
@@ -481,7 +479,7 @@ namespace MeshExplorer.IO.Formats
|
||||
writer.Write("]");
|
||||
}
|
||||
|
||||
private void WriteSegments(Mesh data, StreamWriter writer, int ns)
|
||||
private void WriteSegments(IEnumerable<Segment> data, StreamWriter writer, int ns)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
@@ -491,7 +489,7 @@ namespace MeshExplorer.IO.Formats
|
||||
string seperator;
|
||||
|
||||
writer.Write("\"segments\":{\"data\":[");
|
||||
foreach (var item in data.Segments)
|
||||
foreach (var item in data)
|
||||
{
|
||||
seperator = (i == ns - 1) ? String.Empty : ", ";
|
||||
|
||||
@@ -518,7 +516,7 @@ namespace MeshExplorer.IO.Formats
|
||||
writer.Write("}");
|
||||
}
|
||||
|
||||
private void WriteTriangles(Mesh data, StreamWriter writer, int ne)
|
||||
private void WriteTriangles(IEnumerable<Triangle> data, StreamWriter writer, int ne)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
@@ -527,7 +525,7 @@ namespace MeshExplorer.IO.Formats
|
||||
string seperator;
|
||||
|
||||
writer.Write("\"triangles\":{\"data\":[");
|
||||
foreach (var item in data.Triangles)
|
||||
foreach (var item in data)
|
||||
{
|
||||
seperator = (i == ne - 1) ? String.Empty : ", ";
|
||||
|
||||
|
||||
@@ -6,25 +6,23 @@
|
||||
|
||||
namespace MeshExplorer.IO
|
||||
{
|
||||
using MeshExplorer.Rendering;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.IO;
|
||||
using TriangleNet.Tools;
|
||||
using MeshRenderer.Core;
|
||||
using MeshRenderer.Core.GDI;
|
||||
|
||||
/// <summary>
|
||||
/// Writes an image of the mesh to disk.
|
||||
/// </summary>
|
||||
public class RasterImage
|
||||
{
|
||||
RenderColors colors = RenderColors.Default();
|
||||
ColorManager colors = ColorManager.Default();
|
||||
|
||||
public RenderColors ColorScheme
|
||||
public ColorManager ColorScheme
|
||||
{
|
||||
get { return colors; }
|
||||
set { colors = value; }
|
||||
@@ -40,7 +38,7 @@ namespace MeshExplorer.IO
|
||||
{
|
||||
// Get mesh data -- TODO: Use RenderControl's RenderData
|
||||
RenderData data = new RenderData();
|
||||
data.SetData(mesh);
|
||||
data.SetMesh(mesh);
|
||||
|
||||
// Check file name
|
||||
if (String.IsNullOrWhiteSpace(filename))
|
||||
|
||||
@@ -7,14 +7,10 @@
|
||||
namespace MeshExplorer.IO
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using MeshExplorer.Rendering;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Writes a mesh to an SVG file.
|
||||
|
||||
@@ -69,13 +69,9 @@
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Controls\DarkToolStripRenderer.cs" />
|
||||
<Compile Include="Controls\RendererControl.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DarkMessageBox.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Examples.cs" />
|
||||
<Compile Include="FormExport.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@@ -115,13 +111,27 @@
|
||||
<Compile Include="IO\SvgImage.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Rendering\MeshRenderer.cs" />
|
||||
<Compile Include="Rendering\RenderColors.cs" />
|
||||
<Compile Include="Rendering\RenderData.cs" />
|
||||
<Compile Include="Rendering\VoronoiRenderer.cs" />
|
||||
<Compile Include="Rendering\Zoom.cs" />
|
||||
<Compile Include="Settings.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<Compile Include="Views\AboutView.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Views\AboutView.Designer.cs">
|
||||
<DependentUpon>AboutView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\IView.cs" />
|
||||
<Compile Include="Views\MeshControlView.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Views\MeshControlView.Designer.cs">
|
||||
<DependentUpon>MeshControlView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\StatisticView.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Views\StatisticView.Designer.cs">
|
||||
<DependentUpon>StatisticView.cs</DependentUpon>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="FormExport.resx">
|
||||
<DependentUpon>FormExport.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -131,8 +141,21 @@
|
||||
<EmbeddedResource Include="FormMain.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Views\AboutView.resx">
|
||||
<DependentUpon>AboutView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Views\MeshControlView.resx">
|
||||
<DependentUpon>MeshControlView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Views\StatisticView.resx">
|
||||
<DependentUpon>StatisticView.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\MeshRenderer.Core\MeshRenderer.Core.csproj">
|
||||
<Project>{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}</Project>
|
||||
<Name>MeshRenderer.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Triangle\Triangle.csproj">
|
||||
<Project>{F7907A0A-B75F-400B-9E78-BFAD00DB4D6B}</Project>
|
||||
<Name>Triangle</Name>
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="RenderColors.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Rendering
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
|
||||
/// <summary>
|
||||
/// Mesh color scheme.
|
||||
/// </summary>
|
||||
public class RenderColors
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a color scheme with black background.
|
||||
/// </summary>
|
||||
public static RenderColors Default()
|
||||
{
|
||||
var colors = new RenderColors();
|
||||
|
||||
colors.Background = Color.FromArgb(0, 0, 0);
|
||||
colors.Point = new SolidBrush(Color.Green);
|
||||
colors.SteinerPoint = new SolidBrush(Color.Peru);
|
||||
colors.Triangle = new SolidBrush(Color.Black);
|
||||
colors.Line = new Pen(Color.FromArgb(30, 30, 30));
|
||||
colors.Segment = new Pen(Color.DarkBlue);
|
||||
colors.VoronoiLine = new Pen(Color.FromArgb(40, 50, 60));
|
||||
|
||||
return colors;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets a color scheme with white background.
|
||||
/// </summary>
|
||||
public static RenderColors LightScheme()
|
||||
{
|
||||
var colors = new RenderColors();
|
||||
|
||||
colors.Background = Color.White;
|
||||
colors.Point = new SolidBrush(Color.FromArgb(60, 80, 120));
|
||||
colors.SteinerPoint = new SolidBrush(Color.DarkGreen);
|
||||
colors.Triangle = new SolidBrush(Color.FromArgb(230, 240, 250));
|
||||
colors.Line = new Pen(Color.FromArgb(150, 150, 150));
|
||||
colors.Segment = new Pen(Color.SteelBlue);
|
||||
colors.VoronoiLine = new Pen(Color.FromArgb(160, 170, 180));
|
||||
|
||||
return colors;
|
||||
}
|
||||
|
||||
public Color Background;
|
||||
public Brush Point;
|
||||
public Brush SteinerPoint;
|
||||
public Brush Triangle;
|
||||
public Pen Line;
|
||||
public Pen Segment;
|
||||
public Pen VoronoiLine;
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="RenderData.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Rendering
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet.IO;
|
||||
using System.Drawing;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Data;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// Stores the current mesh in GDI friendly data structure.
|
||||
/// </summary>
|
||||
public class RenderData
|
||||
{
|
||||
public PointF[] Points;
|
||||
|
||||
public Edge[] Edges;
|
||||
public Edge[] Segments;
|
||||
public IEnumerable<ITriangle> Triangles;
|
||||
|
||||
public int NumberOfInputPoints;
|
||||
public RectangleF Bounds;
|
||||
|
||||
/// <summary>
|
||||
/// Update input geometry data.
|
||||
/// </summary>
|
||||
public void SetData(InputGeometry data)
|
||||
{
|
||||
int n = data.Count;
|
||||
int i = 0;
|
||||
|
||||
this.NumberOfInputPoints = n;
|
||||
|
||||
this.Triangles = null;
|
||||
this.Edges = null;
|
||||
|
||||
// Convert points to float
|
||||
this.Points = new PointF[n];
|
||||
foreach (var pt in data.Points)
|
||||
{
|
||||
this.Points[i++] = new PointF((float)pt.X, (float)pt.Y);
|
||||
}
|
||||
|
||||
this.Bounds = new RectangleF(
|
||||
(float)data.Bounds.Xmin,
|
||||
(float)data.Bounds.Ymin,
|
||||
(float)data.Bounds.Width,
|
||||
(float)data.Bounds.Height);
|
||||
|
||||
// Copy segments
|
||||
this.Segments = data.Segments.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update mesh data.
|
||||
/// </summary>
|
||||
public void SetData(Mesh mesh)
|
||||
{
|
||||
mesh.Renumber();
|
||||
|
||||
this.NumberOfInputPoints = mesh.NumberOfInputPoints;
|
||||
|
||||
this.Triangles = mesh.Triangles;
|
||||
|
||||
this.Segments = null;
|
||||
|
||||
int n = mesh.Vertices.Count;
|
||||
|
||||
// Convert points to float
|
||||
this.Points = new PointF[n];
|
||||
|
||||
SetPoints(mesh.Vertices);
|
||||
|
||||
// Get segments
|
||||
if (mesh.IsPolygon)
|
||||
{
|
||||
var segs = mesh.Segments;
|
||||
|
||||
List<Edge> segList = new List<Edge>(mesh.Segments.Count);
|
||||
|
||||
foreach (var seg in segs)
|
||||
{
|
||||
segList.Add(new Edge(seg.P0, seg.P1));
|
||||
}
|
||||
|
||||
this.Segments = segList.ToArray();
|
||||
}
|
||||
|
||||
// Get edges (more efficient than rendering triangles)
|
||||
EdgeEnumerator e = new EdgeEnumerator(mesh);
|
||||
|
||||
List<Edge> edgeList = new List<Edge>(mesh.NumberOfEdges);
|
||||
|
||||
while (e.MoveNext())
|
||||
{
|
||||
edgeList.Add(e.Current);
|
||||
}
|
||||
|
||||
this.Edges = edgeList.ToArray();
|
||||
}
|
||||
|
||||
private void SetPoints(IEnumerable<Vertex> points)
|
||||
{
|
||||
// Bounds
|
||||
float minx = float.MaxValue;
|
||||
float maxx = float.MinValue;
|
||||
float miny = float.MaxValue;
|
||||
float maxy = float.MinValue;
|
||||
|
||||
float x, y;
|
||||
int i = 0;
|
||||
|
||||
foreach (var pt in points)
|
||||
{
|
||||
x = (float)pt.X;
|
||||
y = (float)pt.Y;
|
||||
// Update bounding box
|
||||
if (minx > x) minx = x;
|
||||
if (maxx < x) maxx = x;
|
||||
if (miny > y) miny = y;
|
||||
if (maxy < y) maxy = y;
|
||||
|
||||
this.Points[i] = new PointF(x, y);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
this.Bounds = new RectangleF(minx, miny, maxx - minx, maxy - miny);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,256 +0,0 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="VoronoiRenderer.cs" company="">
|
||||
// Christian Woltering, Triangle.NET, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Rendering
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Tools;
|
||||
|
||||
/// <summary>
|
||||
/// Renders a (bounded) Voronoi diagram.
|
||||
/// </summary>
|
||||
public class VoronoiRenderer
|
||||
{
|
||||
Mesh mesh;
|
||||
Voronoi simpleVoro;
|
||||
BoundedVoronoi boundedVoro;
|
||||
RenderColors renderColors;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="VoronoiRenderer" /> class.
|
||||
/// </summary>
|
||||
public VoronoiRenderer(Mesh mesh)
|
||||
{
|
||||
this.mesh = mesh;
|
||||
|
||||
//if (mesh.NumberOfSegments > 0)
|
||||
if (mesh.IsPolygon)
|
||||
{
|
||||
boundedVoro = new BoundedVoronoi(mesh);
|
||||
}
|
||||
else
|
||||
{
|
||||
simpleVoro = new Voronoi(mesh);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Regenerates the voronoi diagram.
|
||||
/// </summary>
|
||||
public void Update()
|
||||
{
|
||||
if (simpleVoro != null)
|
||||
{
|
||||
simpleVoro.Generate();
|
||||
}
|
||||
|
||||
if (boundedVoro != null)
|
||||
{
|
||||
boundedVoro.Generate();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the voronoi display.
|
||||
/// </summary>
|
||||
public void Reset()
|
||||
{
|
||||
simpleVoro = null;
|
||||
boundedVoro = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Renders the voronoi diagram.
|
||||
/// </summary>
|
||||
public void Render(Graphics g, Zoom zoom, RenderColors renderColors)
|
||||
{
|
||||
this.renderColors = renderColors;
|
||||
|
||||
if (simpleVoro != null)
|
||||
{
|
||||
RenderSimple(g, zoom);
|
||||
return;
|
||||
}
|
||||
|
||||
if (boundedVoro != null)
|
||||
{
|
||||
RenderBounded(g, zoom);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderSimple(Graphics g, Zoom zoom)
|
||||
{
|
||||
PointF p0, p1;
|
||||
|
||||
TriangleNet.Geometry.Point[] points = simpleVoro.Points;
|
||||
|
||||
// Draw edges
|
||||
int n = simpleVoro.Edges == null ? 0 : simpleVoro.Edges.Length;
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
var seg = simpleVoro.Edges[i];
|
||||
|
||||
if (seg.P1 == -1)
|
||||
{
|
||||
// Infinite voronoi edge
|
||||
p0 = new PointF((float)points[seg.P0].X, (float)points[seg.P0].Y);
|
||||
|
||||
if (zoom.ViewportContains(p0) &&
|
||||
BoxRayIntersection(points[seg.P0], simpleVoro.Directions[i], out p1))
|
||||
{
|
||||
RenderEdge(g, zoom, p0, p1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
p0 = new PointF((float)points[seg.P0].X, (float)points[seg.P0].Y);
|
||||
p1 = new PointF((float)points[seg.P1].X, (float)points[seg.P1].Y);
|
||||
|
||||
RenderEdge(g, zoom, p0, p1);
|
||||
}
|
||||
}
|
||||
|
||||
// Scale the points radius to 2 pixel.
|
||||
//float radius = 1.5f / scale, x, y;
|
||||
|
||||
// Draw points
|
||||
//n = voro.Points.Length;
|
||||
|
||||
//for (int i = 0; i < n; i++)
|
||||
//{
|
||||
// x = (float)voro.Points[i].X;
|
||||
// y = (float)voro.Points[i].Y;
|
||||
|
||||
// g.FillEllipse(Brushes.Blue, x - radius, y - radius, 2 * radius, 2 * radius);
|
||||
//}
|
||||
}
|
||||
|
||||
private void RenderBounded(Graphics g, Zoom zoom)
|
||||
{
|
||||
PointF p0, p1;
|
||||
int n;
|
||||
|
||||
foreach (var cell in boundedVoro.Cells)
|
||||
{
|
||||
n = cell.Length;
|
||||
|
||||
for (int i = 1; i < n; i++)
|
||||
{
|
||||
p0 = new PointF((float)cell[i - 1].X, (float)cell[i - 1].Y);
|
||||
p1 = new PointF((float)cell[i].X, (float)cell[i].Y);
|
||||
|
||||
RenderEdge(g, zoom, p0, p1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderEdge(Graphics g, Zoom zoom, PointF p0, PointF p1)
|
||||
{
|
||||
if (zoom.ViewportContains(p0) ||
|
||||
zoom.ViewportContains(p1))
|
||||
{
|
||||
p0 = zoom.WorldToScreen(p0);
|
||||
p1 = zoom.WorldToScreen(p1);
|
||||
|
||||
g.DrawLine(renderColors.VoronoiLine, p0, p1);
|
||||
}
|
||||
}
|
||||
|
||||
private bool BoxRayIntersection(TriangleNet.Geometry.Point pt,
|
||||
TriangleNet.Geometry.Point direction, out PointF intersect)
|
||||
{
|
||||
double x = pt.X;
|
||||
double y = pt.Y;
|
||||
double dx = direction.X;
|
||||
double dy = direction.Y;
|
||||
|
||||
double t1, x1, y1, t2, x2, y2;
|
||||
|
||||
// Bounding box (50% enlarged)
|
||||
var box = mesh.Bounds;
|
||||
|
||||
double dw = box.Width * 0.5f;
|
||||
double dh = box.Height * 0.5f;
|
||||
|
||||
double minX = box.Xmin - dw;
|
||||
double maxX = box.Xmax + dw;
|
||||
double minY = box.Ymin - dh;
|
||||
double maxY = box.Ymax + dh;
|
||||
|
||||
intersect = new PointF();
|
||||
|
||||
// Check if point is inside the bounds
|
||||
if (x < minX || x > maxX || y < minY || y > maxY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Calculate the cut through the vertical boundaries
|
||||
if (dx < 0)
|
||||
{
|
||||
// Line going to the left: intersect with x = minX
|
||||
t1 = (minX - x) / dx;
|
||||
x1 = minX;
|
||||
y1 = y + t1 * dy;
|
||||
}
|
||||
else if (dx > 0)
|
||||
{
|
||||
// Line going to the right: intersect with x = maxX
|
||||
t1 = (maxX - x) / dx;
|
||||
x1 = maxX;
|
||||
y1 = y + t1 * dy;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Line going straight up or down: no intersection possible
|
||||
t1 = double.MaxValue;
|
||||
x1 = y1 = 0;
|
||||
}
|
||||
|
||||
// Calculate the cut through upper and lower boundaries
|
||||
if (dy < 0)
|
||||
{
|
||||
// Line going downwards: intersect with y = minY
|
||||
t2 = (minY - y) / dy;
|
||||
x2 = x + t2 * dx;
|
||||
y2 = minY;
|
||||
}
|
||||
else if (dx > 0)
|
||||
{
|
||||
// Line going upwards: intersect with y = maxY
|
||||
t2 = (maxY - y) / dy;
|
||||
x2 = x + t2 * dx;
|
||||
y2 = maxY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Horizontal line: no intersection possible
|
||||
t2 = double.MaxValue;
|
||||
x2 = y2 = 0;
|
||||
}
|
||||
|
||||
if (t1 < t2)
|
||||
{
|
||||
intersect.X = (float)x1;
|
||||
intersect.Y = (float)y1;
|
||||
}
|
||||
else
|
||||
{
|
||||
intersect.X = (float)x2;
|
||||
intersect.Y = (float)y2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
partial class AboutView
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.lbCodeplex = new System.Windows.Forms.Label();
|
||||
this.label15 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label19 = new System.Windows.Forms.Label();
|
||||
this.label18 = new System.Windows.Forms.Label();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.lbShortcuts = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// lbCodeplex
|
||||
//
|
||||
this.lbCodeplex.AutoSize = true;
|
||||
this.lbCodeplex.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lbCodeplex.ForeColor = System.Drawing.Color.White;
|
||||
this.lbCodeplex.Location = new System.Drawing.Point(72, 82);
|
||||
this.lbCodeplex.Name = "lbCodeplex";
|
||||
this.lbCodeplex.Size = new System.Drawing.Size(153, 13);
|
||||
this.lbCodeplex.TabIndex = 9;
|
||||
this.lbCodeplex.Text = "http://triangle.codeplex.com";
|
||||
this.lbCodeplex.Click += new System.EventHandler(this.lbCodeplex_Clicked);
|
||||
//
|
||||
// label15
|
||||
//
|
||||
this.label15.AutoSize = true;
|
||||
this.label15.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label15.ForeColor = System.Drawing.Color.White;
|
||||
this.label15.Location = new System.Drawing.Point(10, 17);
|
||||
this.label15.Name = "label15";
|
||||
this.label15.Size = new System.Drawing.Size(73, 13);
|
||||
this.label15.TabIndex = 7;
|
||||
this.label15.Text = "Triangle.NET";
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label1.ForeColor = System.Drawing.Color.White;
|
||||
this.label1.Location = new System.Drawing.Point(10, 132);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(108, 13);
|
||||
this.label1.TabIndex = 8;
|
||||
this.label1.Text = "Keyboard shortcuts";
|
||||
//
|
||||
// label19
|
||||
//
|
||||
this.label19.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label19.ForeColor = System.Drawing.Color.White;
|
||||
this.label19.Location = new System.Drawing.Point(72, 42);
|
||||
this.label19.Name = "label19";
|
||||
this.label19.Size = new System.Drawing.Size(134, 40);
|
||||
this.label19.TabIndex = 6;
|
||||
this.label19.Text = "Beta 2 (2012-10-14)\r\nChristian Woltering\r\nMIT";
|
||||
//
|
||||
// label18
|
||||
//
|
||||
this.label18.ForeColor = System.Drawing.Color.White;
|
||||
this.label18.Location = new System.Drawing.Point(15, 42);
|
||||
this.label18.Name = "label18";
|
||||
this.label18.Size = new System.Drawing.Size(51, 40);
|
||||
this.label18.TabIndex = 4;
|
||||
this.label18.Text = "Version:\r\nAuthor:\r\nLicense:";
|
||||
this.label18.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label7.ForeColor = System.Drawing.Color.White;
|
||||
this.label7.Location = new System.Drawing.Point(72, 155);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(134, 108);
|
||||
this.label7.TabIndex = 5;
|
||||
this.label7.Text = "File Open\r\nFile Save\r\nReload Input\r\n\r\nTriangulate / Refine\r\nSmooth\r\n\r\nShow Log";
|
||||
//
|
||||
// lbShortcuts
|
||||
//
|
||||
this.lbShortcuts.ForeColor = System.Drawing.Color.White;
|
||||
this.lbShortcuts.Location = new System.Drawing.Point(24, 155);
|
||||
this.lbShortcuts.Name = "lbShortcuts";
|
||||
this.lbShortcuts.Size = new System.Drawing.Size(36, 108);
|
||||
this.lbShortcuts.TabIndex = 3;
|
||||
this.lbShortcuts.Text = "F3\r\nF4\r\nF5\r\n\r\nF8\r\nF9\r\n\r\nF12";
|
||||
this.lbShortcuts.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||
//
|
||||
// AboutView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.DimGray;
|
||||
this.Controls.Add(this.lbCodeplex);
|
||||
this.Controls.Add(this.label15);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.label19);
|
||||
this.Controls.Add(this.label18);
|
||||
this.Controls.Add(this.label7);
|
||||
this.Controls.Add(this.lbShortcuts);
|
||||
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.Name = "AboutView";
|
||||
this.Size = new System.Drawing.Size(272, 509);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label lbCodeplex;
|
||||
private System.Windows.Forms.Label label15;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label label19;
|
||||
private System.Windows.Forms.Label label18;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private System.Windows.Forms.Label lbShortcuts;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using TriangleNet;
|
||||
using System.Diagnostics;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
public partial class AboutView : UserControl, IView
|
||||
{
|
||||
public AboutView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void lbCodeplex_Clicked(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
ProcessStartInfo info = new ProcessStartInfo("http://triangle.codeplex.com/");
|
||||
Process.Start(info);
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
}
|
||||
|
||||
#region IView
|
||||
|
||||
public void HandleNewInput(InputGeometry geometry)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshImport(InputGeometry geometry, Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshUpdate(Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshChange(Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,26 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="IView.cs" company="">
|
||||
// TODO: Update copyright text.
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
/// <summary>
|
||||
/// TODO: Update summary.
|
||||
/// </summary>
|
||||
public interface IView
|
||||
{
|
||||
void HandleNewInput(InputGeometry geometry);
|
||||
void HandleMeshImport(InputGeometry geometry, Mesh mesh);
|
||||
void HandleMeshUpdate(Mesh mesh);
|
||||
void HandleMeshChange(Mesh mesh);
|
||||
}
|
||||
}
|
||||
+219
@@ -0,0 +1,219 @@
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
partial class MeshControlView
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.lbMaxArea = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.lbMinAngle = new System.Windows.Forms.Label();
|
||||
this.label23 = new System.Windows.Forms.Label();
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.slMaxArea = new MeshExplorer.Controls.DarkSlider();
|
||||
this.slMinAngle = new MeshExplorer.Controls.DarkSlider();
|
||||
this.cbConformDel = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.cbConvex = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.cbQuality = new MeshExplorer.Controls.DarkCheckBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// lbMaxArea
|
||||
//
|
||||
this.lbMaxArea.AutoSize = true;
|
||||
this.lbMaxArea.ForeColor = System.Drawing.Color.White;
|
||||
this.lbMaxArea.Location = new System.Drawing.Point(227, 65);
|
||||
this.lbMaxArea.Name = "lbMaxArea";
|
||||
this.lbMaxArea.Size = new System.Drawing.Size(13, 13);
|
||||
this.lbMaxArea.TabIndex = 20;
|
||||
this.lbMaxArea.Text = "0";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.ForeColor = System.Drawing.Color.White;
|
||||
this.label6.Location = new System.Drawing.Point(8, 64);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(81, 13);
|
||||
this.label6.TabIndex = 23;
|
||||
this.label6.Text = "Maximum area";
|
||||
//
|
||||
// lbMinAngle
|
||||
//
|
||||
this.lbMinAngle.AutoSize = true;
|
||||
this.lbMinAngle.ForeColor = System.Drawing.Color.White;
|
||||
this.lbMinAngle.Location = new System.Drawing.Point(227, 43);
|
||||
this.lbMinAngle.Name = "lbMinAngle";
|
||||
this.lbMinAngle.Size = new System.Drawing.Size(19, 13);
|
||||
this.lbMinAngle.TabIndex = 22;
|
||||
this.lbMinAngle.Text = "20";
|
||||
//
|
||||
// label23
|
||||
//
|
||||
this.label23.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label23.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label23.Location = new System.Drawing.Point(8, 151);
|
||||
this.label23.Name = "label23";
|
||||
this.label23.Size = new System.Drawing.Size(251, 33);
|
||||
this.label23.TabIndex = 24;
|
||||
this.label23.Text = "Ensure that all triangles in the mesh are truly Delaunay, and not just constraine" +
|
||||
"d Delaunay.";
|
||||
//
|
||||
// label9
|
||||
//
|
||||
this.label9.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label9.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label9.Location = new System.Drawing.Point(8, 215);
|
||||
this.label9.Name = "label9";
|
||||
this.label9.Size = new System.Drawing.Size(258, 33);
|
||||
this.label9.TabIndex = 26;
|
||||
this.label9.Text = "Use the convex mesh option, if the convex hull should be included in the output.";
|
||||
//
|
||||
// label8
|
||||
//
|
||||
this.label8.BackColor = System.Drawing.Color.DimGray;
|
||||
this.label8.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label8.Location = new System.Drawing.Point(8, 88);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(258, 33);
|
||||
this.label8.TabIndex = 25;
|
||||
this.label8.Text = "Hint: maximum area values of 0 or 1 will be irgnored (no area constraints are set" +
|
||||
").";
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.ForeColor = System.Drawing.Color.White;
|
||||
this.label5.Location = new System.Drawing.Point(8, 42);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(87, 13);
|
||||
this.label5.TabIndex = 21;
|
||||
this.label5.Text = "Minimum angle";
|
||||
//
|
||||
// slMaxArea
|
||||
//
|
||||
this.slMaxArea.BackColor = System.Drawing.Color.Transparent;
|
||||
this.slMaxArea.CriticalPercent = ((uint)(0u));
|
||||
this.slMaxArea.Location = new System.Drawing.Point(102, 61);
|
||||
this.slMaxArea.Maximum = 100;
|
||||
this.slMaxArea.Minimum = 0;
|
||||
this.slMaxArea.Name = "slMaxArea";
|
||||
this.slMaxArea.Size = new System.Drawing.Size(119, 18);
|
||||
this.slMaxArea.TabIndex = 19;
|
||||
this.slMaxArea.Text = "darkSlider1";
|
||||
this.slMaxArea.Value = 0;
|
||||
this.slMaxArea.ValueChanging += new System.EventHandler(this.slMaxArea_ValueChanging);
|
||||
//
|
||||
// slMinAngle
|
||||
//
|
||||
this.slMinAngle.BackColor = System.Drawing.Color.Transparent;
|
||||
this.slMinAngle.CriticalPercent = ((uint)(89u));
|
||||
this.slMinAngle.Location = new System.Drawing.Point(102, 39);
|
||||
this.slMinAngle.Maximum = 100;
|
||||
this.slMinAngle.Minimum = 0;
|
||||
this.slMinAngle.Name = "slMinAngle";
|
||||
this.slMinAngle.Size = new System.Drawing.Size(119, 18);
|
||||
this.slMinAngle.TabIndex = 18;
|
||||
this.slMinAngle.Text = "darkSlider1";
|
||||
this.slMinAngle.Value = 50;
|
||||
this.slMinAngle.ValueChanging += new System.EventHandler(this.slMinAngle_ValueChanging);
|
||||
//
|
||||
// cbConformDel
|
||||
//
|
||||
this.cbConformDel.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbConformDel.Checked = false;
|
||||
this.cbConformDel.Location = new System.Drawing.Point(11, 131);
|
||||
this.cbConformDel.Name = "cbConformDel";
|
||||
this.cbConformDel.Size = new System.Drawing.Size(142, 17);
|
||||
this.cbConformDel.TabIndex = 16;
|
||||
this.cbConformDel.Text = "Conforming Delaunay";
|
||||
this.cbConformDel.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// cbConvex
|
||||
//
|
||||
this.cbConvex.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbConvex.Checked = false;
|
||||
this.cbConvex.Location = new System.Drawing.Point(11, 195);
|
||||
this.cbConvex.Name = "cbConvex";
|
||||
this.cbConvex.Size = new System.Drawing.Size(115, 17);
|
||||
this.cbConvex.TabIndex = 15;
|
||||
this.cbConvex.Text = "Convex mesh";
|
||||
this.cbConvex.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// cbQuality
|
||||
//
|
||||
this.cbQuality.BackColor = System.Drawing.Color.DimGray;
|
||||
this.cbQuality.Checked = false;
|
||||
this.cbQuality.Location = new System.Drawing.Point(11, 16);
|
||||
this.cbQuality.Name = "cbQuality";
|
||||
this.cbQuality.Size = new System.Drawing.Size(115, 17);
|
||||
this.cbQuality.TabIndex = 17;
|
||||
this.cbQuality.Text = "Quality mesh";
|
||||
this.cbQuality.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// MeshControlView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.DimGray;
|
||||
this.Controls.Add(this.lbMaxArea);
|
||||
this.Controls.Add(this.label6);
|
||||
this.Controls.Add(this.lbMinAngle);
|
||||
this.Controls.Add(this.label23);
|
||||
this.Controls.Add(this.label9);
|
||||
this.Controls.Add(this.label8);
|
||||
this.Controls.Add(this.label5);
|
||||
this.Controls.Add(this.slMaxArea);
|
||||
this.Controls.Add(this.slMinAngle);
|
||||
this.Controls.Add(this.cbConformDel);
|
||||
this.Controls.Add(this.cbConvex);
|
||||
this.Controls.Add(this.cbQuality);
|
||||
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.Name = "MeshControlView";
|
||||
this.Size = new System.Drawing.Size(272, 509);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label lbMaxArea;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.Label lbMinAngle;
|
||||
private System.Windows.Forms.Label label23;
|
||||
private System.Windows.Forms.Label label9;
|
||||
private System.Windows.Forms.Label label8;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private Controls.DarkSlider slMaxArea;
|
||||
private Controls.DarkSlider slMinAngle;
|
||||
private Controls.DarkCheckBox cbConformDel;
|
||||
private Controls.DarkCheckBox cbConvex;
|
||||
private Controls.DarkCheckBox cbQuality;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
public partial class MeshControlView : UserControl, IView
|
||||
{
|
||||
public MeshControlView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public bool ParamQualityChecked
|
||||
{
|
||||
get { return cbQuality.Checked; }
|
||||
}
|
||||
|
||||
public bool ParamConvexChecked
|
||||
{
|
||||
get { return cbConvex.Checked; }
|
||||
}
|
||||
|
||||
public bool ParamConformDelChecked
|
||||
{
|
||||
get { return cbConformDel.Checked; }
|
||||
}
|
||||
|
||||
public int ParamMinAngleValue
|
||||
{
|
||||
get { return (slMinAngle.Value * 40) / 100; }
|
||||
}
|
||||
|
||||
public double ParamMaxAreaValue
|
||||
{
|
||||
get { return slMaxArea.Value * 0.01; }
|
||||
}
|
||||
|
||||
private void slMinAngle_ValueChanging(object sender, EventArgs e)
|
||||
{
|
||||
// Between 0 and 40 (step 1)
|
||||
int angle = (slMinAngle.Value * 40) / 100;
|
||||
lbMinAngle.Text = angle.ToString();
|
||||
}
|
||||
|
||||
private void slMaxArea_ValueChanging(object sender, EventArgs e)
|
||||
{
|
||||
// Between 0 and 1 (step 0.01)
|
||||
double area = slMaxArea.Value * 0.01;
|
||||
lbMaxArea.Text = area.ToString(Util.Nfi);
|
||||
}
|
||||
|
||||
#region IView
|
||||
|
||||
public void HandleNewInput(InputGeometry geometry)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshImport(InputGeometry geometry, Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshUpdate(Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
public void HandleMeshChange(Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
+483
@@ -0,0 +1,483 @@
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
partial class StatisticView
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.label20 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.lbNumSeg = new System.Windows.Forms.Label();
|
||||
this.lbNumSeg2 = new System.Windows.Forms.Label();
|
||||
this.lbNumTri = new System.Windows.Forms.Label();
|
||||
this.lbNumTri2 = new System.Windows.Forms.Label();
|
||||
this.lbNumVert = new System.Windows.Forms.Label();
|
||||
this.lbNumVert2 = new System.Windows.Forms.Label();
|
||||
this.label32 = new System.Windows.Forms.Label();
|
||||
this.label13 = new System.Windows.Forms.Label();
|
||||
this.label31 = new System.Windows.Forms.Label();
|
||||
this.label12 = new System.Windows.Forms.Label();
|
||||
this.label16 = new System.Windows.Forms.Label();
|
||||
this.label29 = new System.Windows.Forms.Label();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.lbAngleMax = new System.Windows.Forms.Label();
|
||||
this.lbQualAspectAve = new System.Windows.Forms.Label();
|
||||
this.lbEdgeMax = new System.Windows.Forms.Label();
|
||||
this.lbQualAlphaAve = new System.Windows.Forms.Label();
|
||||
this.lbAreaMax = new System.Windows.Forms.Label();
|
||||
this.lbAngleMin = new System.Windows.Forms.Label();
|
||||
this.lbQualAspectMin = new System.Windows.Forms.Label();
|
||||
this.lbEdgeMin = new System.Windows.Forms.Label();
|
||||
this.lbQualAlphaMin = new System.Windows.Forms.Label();
|
||||
this.lbAreaMin = new System.Windows.Forms.Label();
|
||||
this.label22 = new System.Windows.Forms.Label();
|
||||
this.label10 = new System.Windows.Forms.Label();
|
||||
this.label17 = new System.Windows.Forms.Label();
|
||||
this.label21 = new System.Windows.Forms.Label();
|
||||
this.label11 = new System.Windows.Forms.Label();
|
||||
this.angleHistogram1 = new MeshExplorer.Controls.AngleHistogram();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label20
|
||||
//
|
||||
this.label20.AutoSize = true;
|
||||
this.label20.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label20.ForeColor = System.Drawing.Color.White;
|
||||
this.label20.Location = new System.Drawing.Point(8, 17);
|
||||
this.label20.Name = "label20";
|
||||
this.label20.Size = new System.Drawing.Size(39, 13);
|
||||
this.label20.TabIndex = 59;
|
||||
this.label20.Text = "Mesh:";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label4.Location = new System.Drawing.Point(8, 57);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(60, 13);
|
||||
this.label4.TabIndex = 56;
|
||||
this.label4.Text = "Segments:";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label3.Location = new System.Drawing.Point(8, 76);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(56, 13);
|
||||
this.label3.TabIndex = 57;
|
||||
this.label3.Text = "Triangles:";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label2.Location = new System.Drawing.Point(8, 38);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(50, 13);
|
||||
this.label2.TabIndex = 58;
|
||||
this.label2.Text = "Vertices:";
|
||||
//
|
||||
// lbNumSeg
|
||||
//
|
||||
this.lbNumSeg.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumSeg.Location = new System.Drawing.Point(98, 57);
|
||||
this.lbNumSeg.Name = "lbNumSeg";
|
||||
this.lbNumSeg.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumSeg.TabIndex = 53;
|
||||
this.lbNumSeg.Text = "-";
|
||||
this.lbNumSeg.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumSeg2
|
||||
//
|
||||
this.lbNumSeg2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumSeg2.Location = new System.Drawing.Point(188, 57);
|
||||
this.lbNumSeg2.Name = "lbNumSeg2";
|
||||
this.lbNumSeg2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumSeg2.TabIndex = 52;
|
||||
this.lbNumSeg2.Text = "-";
|
||||
this.lbNumSeg2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumTri
|
||||
//
|
||||
this.lbNumTri.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumTri.Location = new System.Drawing.Point(98, 76);
|
||||
this.lbNumTri.Name = "lbNumTri";
|
||||
this.lbNumTri.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumTri.TabIndex = 50;
|
||||
this.lbNumTri.Text = "-";
|
||||
this.lbNumTri.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumTri2
|
||||
//
|
||||
this.lbNumTri2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumTri2.Location = new System.Drawing.Point(188, 76);
|
||||
this.lbNumTri2.Name = "lbNumTri2";
|
||||
this.lbNumTri2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumTri2.TabIndex = 51;
|
||||
this.lbNumTri2.Text = "-";
|
||||
this.lbNumTri2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumVert
|
||||
//
|
||||
this.lbNumVert.ForeColor = System.Drawing.Color.White;
|
||||
this.lbNumVert.Location = new System.Drawing.Point(98, 38);
|
||||
this.lbNumVert.Name = "lbNumVert";
|
||||
this.lbNumVert.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumVert.TabIndex = 54;
|
||||
this.lbNumVert.Text = "-";
|
||||
this.lbNumVert.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbNumVert2
|
||||
//
|
||||
this.lbNumVert2.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.lbNumVert2.Location = new System.Drawing.Point(188, 38);
|
||||
this.lbNumVert2.Name = "lbNumVert2";
|
||||
this.lbNumVert2.Size = new System.Drawing.Size(70, 13);
|
||||
this.lbNumVert2.TabIndex = 55;
|
||||
this.lbNumVert2.Text = "-";
|
||||
this.lbNumVert2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// label32
|
||||
//
|
||||
this.label32.AutoSize = true;
|
||||
this.label32.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label32.Location = new System.Drawing.Point(210, 213);
|
||||
this.label32.Name = "label32";
|
||||
this.label32.Size = new System.Drawing.Size(48, 13);
|
||||
this.label32.TabIndex = 41;
|
||||
this.label32.Text = "Average";
|
||||
//
|
||||
// label13
|
||||
//
|
||||
this.label13.AutoSize = true;
|
||||
this.label13.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label13.Location = new System.Drawing.Point(202, 114);
|
||||
this.label13.Name = "label13";
|
||||
this.label13.Size = new System.Drawing.Size(56, 13);
|
||||
this.label13.TabIndex = 42;
|
||||
this.label13.Text = "Maximum";
|
||||
//
|
||||
// label31
|
||||
//
|
||||
this.label31.AutoSize = true;
|
||||
this.label31.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label31.Location = new System.Drawing.Point(112, 213);
|
||||
this.label31.Name = "label31";
|
||||
this.label31.Size = new System.Drawing.Size(55, 13);
|
||||
this.label31.TabIndex = 44;
|
||||
this.label31.Text = "Minimum";
|
||||
//
|
||||
// label12
|
||||
//
|
||||
this.label12.AutoSize = true;
|
||||
this.label12.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label12.Location = new System.Drawing.Point(113, 114);
|
||||
this.label12.Name = "label12";
|
||||
this.label12.Size = new System.Drawing.Size(55, 13);
|
||||
this.label12.TabIndex = 43;
|
||||
this.label12.Text = "Minimum";
|
||||
//
|
||||
// label16
|
||||
//
|
||||
this.label16.AutoSize = true;
|
||||
this.label16.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label16.Location = new System.Drawing.Point(8, 173);
|
||||
this.label16.Name = "label16";
|
||||
this.label16.Size = new System.Drawing.Size(40, 13);
|
||||
this.label16.TabIndex = 40;
|
||||
this.label16.Text = "Angle:";
|
||||
//
|
||||
// label29
|
||||
//
|
||||
this.label29.AutoSize = true;
|
||||
this.label29.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label29.Location = new System.Drawing.Point(8, 253);
|
||||
this.label29.Name = "label29";
|
||||
this.label29.Size = new System.Drawing.Size(71, 13);
|
||||
this.label29.TabIndex = 47;
|
||||
this.label29.Text = "Aspect ratio:";
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label14.Location = new System.Drawing.Point(8, 154);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(73, 13);
|
||||
this.label14.TabIndex = 48;
|
||||
this.label14.Text = "Edge length:";
|
||||
//
|
||||
// lbAngleMax
|
||||
//
|
||||
this.lbAngleMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAngleMax.Location = new System.Drawing.Point(182, 173);
|
||||
this.lbAngleMax.Name = "lbAngleMax";
|
||||
this.lbAngleMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbAngleMax.TabIndex = 49;
|
||||
this.lbAngleMax.Text = "-";
|
||||
this.lbAngleMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAspectAve
|
||||
//
|
||||
this.lbQualAspectAve.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAspectAve.Location = new System.Drawing.Point(182, 253);
|
||||
this.lbQualAspectAve.Name = "lbQualAspectAve";
|
||||
this.lbQualAspectAve.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbQualAspectAve.TabIndex = 46;
|
||||
this.lbQualAspectAve.Text = "-";
|
||||
this.lbQualAspectAve.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbEdgeMax
|
||||
//
|
||||
this.lbEdgeMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbEdgeMax.Location = new System.Drawing.Point(182, 154);
|
||||
this.lbEdgeMax.Name = "lbEdgeMax";
|
||||
this.lbEdgeMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbEdgeMax.TabIndex = 45;
|
||||
this.lbEdgeMax.Text = "-";
|
||||
this.lbEdgeMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAlphaAve
|
||||
//
|
||||
this.lbQualAlphaAve.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAlphaAve.Location = new System.Drawing.Point(182, 234);
|
||||
this.lbQualAlphaAve.Name = "lbQualAlphaAve";
|
||||
this.lbQualAlphaAve.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbQualAlphaAve.TabIndex = 30;
|
||||
this.lbQualAlphaAve.Text = "-";
|
||||
this.lbQualAlphaAve.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAreaMax
|
||||
//
|
||||
this.lbAreaMax.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAreaMax.Location = new System.Drawing.Point(182, 135);
|
||||
this.lbAreaMax.Name = "lbAreaMax";
|
||||
this.lbAreaMax.Size = new System.Drawing.Size(76, 13);
|
||||
this.lbAreaMax.TabIndex = 31;
|
||||
this.lbAreaMax.Text = "-";
|
||||
this.lbAreaMax.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAngleMin
|
||||
//
|
||||
this.lbAngleMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAngleMin.Location = new System.Drawing.Point(100, 173);
|
||||
this.lbAngleMin.Name = "lbAngleMin";
|
||||
this.lbAngleMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbAngleMin.TabIndex = 32;
|
||||
this.lbAngleMin.Text = "-";
|
||||
this.lbAngleMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAspectMin
|
||||
//
|
||||
this.lbQualAspectMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAspectMin.Location = new System.Drawing.Point(100, 253);
|
||||
this.lbQualAspectMin.Name = "lbQualAspectMin";
|
||||
this.lbQualAspectMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbQualAspectMin.TabIndex = 29;
|
||||
this.lbQualAspectMin.Text = "-";
|
||||
this.lbQualAspectMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbEdgeMin
|
||||
//
|
||||
this.lbEdgeMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbEdgeMin.Location = new System.Drawing.Point(100, 154);
|
||||
this.lbEdgeMin.Name = "lbEdgeMin";
|
||||
this.lbEdgeMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbEdgeMin.TabIndex = 28;
|
||||
this.lbEdgeMin.Text = "-";
|
||||
this.lbEdgeMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbQualAlphaMin
|
||||
//
|
||||
this.lbQualAlphaMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbQualAlphaMin.Location = new System.Drawing.Point(100, 234);
|
||||
this.lbQualAlphaMin.Name = "lbQualAlphaMin";
|
||||
this.lbQualAlphaMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbQualAlphaMin.TabIndex = 37;
|
||||
this.lbQualAlphaMin.Text = "-";
|
||||
this.lbQualAlphaMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// lbAreaMin
|
||||
//
|
||||
this.lbAreaMin.ForeColor = System.Drawing.Color.White;
|
||||
this.lbAreaMin.Location = new System.Drawing.Point(100, 135);
|
||||
this.lbAreaMin.Name = "lbAreaMin";
|
||||
this.lbAreaMin.Size = new System.Drawing.Size(68, 13);
|
||||
this.lbAreaMin.TabIndex = 36;
|
||||
this.lbAreaMin.Text = "-";
|
||||
this.lbAreaMin.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// label22
|
||||
//
|
||||
this.label22.AutoSize = true;
|
||||
this.label22.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label22.Location = new System.Drawing.Point(8, 234);
|
||||
this.label22.Name = "label22";
|
||||
this.label22.Size = new System.Drawing.Size(65, 13);
|
||||
this.label22.TabIndex = 39;
|
||||
this.label22.Text = "Min. angle:";
|
||||
//
|
||||
// label10
|
||||
//
|
||||
this.label10.AutoSize = true;
|
||||
this.label10.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.label10.Location = new System.Drawing.Point(8, 135);
|
||||
this.label10.Name = "label10";
|
||||
this.label10.Size = new System.Drawing.Size(76, 13);
|
||||
this.label10.TabIndex = 38;
|
||||
this.label10.Text = "Triangle area:";
|
||||
//
|
||||
// label17
|
||||
//
|
||||
this.label17.AutoSize = true;
|
||||
this.label17.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label17.ForeColor = System.Drawing.Color.White;
|
||||
this.label17.Location = new System.Drawing.Point(8, 290);
|
||||
this.label17.Name = "label17";
|
||||
this.label17.Size = new System.Drawing.Size(97, 13);
|
||||
this.label17.TabIndex = 33;
|
||||
this.label17.Text = "Angle histogram:";
|
||||
//
|
||||
// label21
|
||||
//
|
||||
this.label21.AutoSize = true;
|
||||
this.label21.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label21.ForeColor = System.Drawing.Color.White;
|
||||
this.label21.Location = new System.Drawing.Point(8, 213);
|
||||
this.label21.Name = "label21";
|
||||
this.label21.Size = new System.Drawing.Size(47, 13);
|
||||
this.label21.TabIndex = 35;
|
||||
this.label21.Text = "Quality:";
|
||||
//
|
||||
// label11
|
||||
//
|
||||
this.label11.AutoSize = true;
|
||||
this.label11.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label11.ForeColor = System.Drawing.Color.White;
|
||||
this.label11.Location = new System.Drawing.Point(8, 114);
|
||||
this.label11.Name = "label11";
|
||||
this.label11.Size = new System.Drawing.Size(50, 13);
|
||||
this.label11.TabIndex = 34;
|
||||
this.label11.Text = "Statistic:";
|
||||
//
|
||||
// angleHistogram1
|
||||
//
|
||||
this.angleHistogram1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(76)))), ((int)(((byte)(76)))));
|
||||
this.angleHistogram1.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.angleHistogram1.Location = new System.Drawing.Point(6, 308);
|
||||
this.angleHistogram1.Name = "angleHistogram1";
|
||||
this.angleHistogram1.Size = new System.Drawing.Size(260, 195);
|
||||
this.angleHistogram1.TabIndex = 27;
|
||||
this.angleHistogram1.Text = "angleHistogram1";
|
||||
//
|
||||
// StatisticView
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.DimGray;
|
||||
this.Controls.Add(this.label20);
|
||||
this.Controls.Add(this.label4);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.lbNumSeg);
|
||||
this.Controls.Add(this.lbNumSeg2);
|
||||
this.Controls.Add(this.lbNumTri);
|
||||
this.Controls.Add(this.lbNumTri2);
|
||||
this.Controls.Add(this.lbNumVert);
|
||||
this.Controls.Add(this.lbNumVert2);
|
||||
this.Controls.Add(this.label32);
|
||||
this.Controls.Add(this.label13);
|
||||
this.Controls.Add(this.label31);
|
||||
this.Controls.Add(this.label12);
|
||||
this.Controls.Add(this.label16);
|
||||
this.Controls.Add(this.label29);
|
||||
this.Controls.Add(this.label14);
|
||||
this.Controls.Add(this.lbAngleMax);
|
||||
this.Controls.Add(this.lbQualAspectAve);
|
||||
this.Controls.Add(this.lbEdgeMax);
|
||||
this.Controls.Add(this.lbQualAlphaAve);
|
||||
this.Controls.Add(this.lbAreaMax);
|
||||
this.Controls.Add(this.lbAngleMin);
|
||||
this.Controls.Add(this.lbQualAspectMin);
|
||||
this.Controls.Add(this.lbEdgeMin);
|
||||
this.Controls.Add(this.lbQualAlphaMin);
|
||||
this.Controls.Add(this.lbAreaMin);
|
||||
this.Controls.Add(this.label22);
|
||||
this.Controls.Add(this.label10);
|
||||
this.Controls.Add(this.label17);
|
||||
this.Controls.Add(this.label21);
|
||||
this.Controls.Add(this.label11);
|
||||
this.Controls.Add(this.angleHistogram1);
|
||||
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.ForeColor = System.Drawing.Color.DarkGray;
|
||||
this.Name = "StatisticView";
|
||||
this.Size = new System.Drawing.Size(272, 509);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label20;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label lbNumSeg;
|
||||
private System.Windows.Forms.Label lbNumSeg2;
|
||||
private System.Windows.Forms.Label lbNumTri;
|
||||
private System.Windows.Forms.Label lbNumTri2;
|
||||
private System.Windows.Forms.Label lbNumVert;
|
||||
private System.Windows.Forms.Label lbNumVert2;
|
||||
private System.Windows.Forms.Label label32;
|
||||
private System.Windows.Forms.Label label13;
|
||||
private System.Windows.Forms.Label label31;
|
||||
private System.Windows.Forms.Label label12;
|
||||
private System.Windows.Forms.Label label16;
|
||||
private System.Windows.Forms.Label label29;
|
||||
private System.Windows.Forms.Label label14;
|
||||
private System.Windows.Forms.Label lbAngleMax;
|
||||
private System.Windows.Forms.Label lbQualAspectAve;
|
||||
private System.Windows.Forms.Label lbEdgeMax;
|
||||
private System.Windows.Forms.Label lbQualAlphaAve;
|
||||
private System.Windows.Forms.Label lbAreaMax;
|
||||
private System.Windows.Forms.Label lbAngleMin;
|
||||
private System.Windows.Forms.Label lbQualAspectMin;
|
||||
private System.Windows.Forms.Label lbEdgeMin;
|
||||
private System.Windows.Forms.Label lbQualAlphaMin;
|
||||
private System.Windows.Forms.Label lbAreaMin;
|
||||
private System.Windows.Forms.Label label22;
|
||||
private System.Windows.Forms.Label label10;
|
||||
private System.Windows.Forms.Label label17;
|
||||
private System.Windows.Forms.Label label21;
|
||||
private System.Windows.Forms.Label label11;
|
||||
private Controls.AngleHistogram angleHistogram1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using TriangleNet;
|
||||
using TriangleNet.Tools;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
namespace MeshExplorer.Views
|
||||
{
|
||||
public partial class StatisticView : UserControl, IView
|
||||
{
|
||||
Statistic statistic = new Statistic();
|
||||
QualityMeasure quality;
|
||||
|
||||
public Statistic Statistic
|
||||
{
|
||||
get { return statistic; }
|
||||
}
|
||||
|
||||
public StatisticView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void UpdateStatistic(Mesh mesh)
|
||||
{
|
||||
statistic.Update(mesh, 10);
|
||||
}
|
||||
|
||||
#region IView
|
||||
|
||||
public void HandleNewInput(InputGeometry geometry)
|
||||
{
|
||||
// Reset labels
|
||||
lbNumVert2.Text = "-";
|
||||
lbNumTri2.Text = "-";
|
||||
lbNumSeg2.Text = "-";
|
||||
|
||||
lbNumVert.Text = geometry.Count.ToString();
|
||||
lbNumSeg.Text = geometry.Segments.Count().ToString();
|
||||
lbNumTri.Text = "0";
|
||||
|
||||
// Statistics labels
|
||||
lbAreaMin.Text = "-";
|
||||
lbAreaMax.Text = "-";
|
||||
lbEdgeMin.Text = "-";
|
||||
lbEdgeMax.Text = "-";
|
||||
lbAngleMin.Text = "-";
|
||||
lbAngleMax.Text = "-";
|
||||
|
||||
// Quality labels
|
||||
lbQualAlphaMin.Text = "-";
|
||||
lbQualAlphaAve.Text = "-";
|
||||
lbQualAspectMin.Text = "-";
|
||||
lbQualAspectAve.Text = "-";
|
||||
|
||||
angleHistogram1.SetData(null, null);
|
||||
}
|
||||
|
||||
public void HandleMeshImport(InputGeometry geometry, Mesh mesh)
|
||||
{
|
||||
// Previous mesh stats
|
||||
lbNumVert2.Text = "-";
|
||||
lbNumTri2.Text = "-";
|
||||
lbNumSeg2.Text = "-";
|
||||
}
|
||||
|
||||
public void HandleMeshUpdate(Mesh mesh)
|
||||
{
|
||||
// Previous mesh stats
|
||||
lbNumVert2.Text = lbNumVert.Text;
|
||||
lbNumTri2.Text = lbNumTri.Text;
|
||||
lbNumSeg2.Text = lbNumSeg.Text;
|
||||
}
|
||||
|
||||
public void HandleMeshChange(Mesh mesh)
|
||||
{
|
||||
// New mesh stats
|
||||
lbNumVert.Text = statistic.Vertices.ToString();
|
||||
lbNumSeg.Text = statistic.ConstrainedEdges.ToString();
|
||||
lbNumTri.Text = statistic.Triangles.ToString();
|
||||
|
||||
// Update statistics tab
|
||||
angleHistogram1.SetData(statistic.MinAngleHistogram, statistic.MaxAngleHistogram);
|
||||
|
||||
lbAreaMin.Text = Util.DoubleToString(statistic.SmallestArea);
|
||||
lbAreaMax.Text = Util.DoubleToString(statistic.LargestArea);
|
||||
lbEdgeMin.Text = Util.DoubleToString(statistic.ShortestEdge);
|
||||
lbEdgeMax.Text = Util.DoubleToString(statistic.LongestEdge);
|
||||
lbAngleMin.Text = Util.AngleToString(statistic.SmallestAngle);
|
||||
lbAngleMax.Text = Util.AngleToString(statistic.LargestAngle);
|
||||
|
||||
// Update quality
|
||||
if (quality == null)
|
||||
{
|
||||
quality = new QualityMeasure();
|
||||
}
|
||||
|
||||
quality.Update(mesh);
|
||||
|
||||
lbQualAlphaMin.Text = Util.DoubleToString(quality.AlphaMinimum);
|
||||
lbQualAlphaAve.Text = Util.DoubleToString(quality.AlphaAverage);
|
||||
|
||||
lbQualAspectMin.Text = Util.DoubleToString(quality.Q_Minimum);
|
||||
lbQualAspectAve.Text = Util.DoubleToString(quality.Q_Average);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -5,9 +5,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Triangle", "Triangle\Triang
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mesh Explorer", "TestApp\Mesh Explorer.csproj", "{336AAF8A-5316-4303-9E73-5E38BD0B28AF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeshRenderer.Core", "MeshRenderer.Core\MeshRenderer.Core.csproj", "{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(TeamFoundationVersionControl) = preSolution
|
||||
SccNumberOfProjects = 3
|
||||
SccNumberOfProjects = 4
|
||||
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
|
||||
SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs06
|
||||
SccLocalPath0 = .
|
||||
@@ -17,6 +19,9 @@ Global
|
||||
SccProjectUniqueName2 = TestApp\\Mesh\u0020Explorer.csproj
|
||||
SccProjectName2 = TestApp
|
||||
SccLocalPath2 = TestApp
|
||||
SccProjectUniqueName3 = MeshRenderer.Core\\MeshRenderer.Core.csproj
|
||||
SccProjectName3 = MeshRenderer.Core
|
||||
SccLocalPath3 = MeshRenderer.Core
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -47,6 +52,16 @@ Global
|
||||
{336AAF8A-5316-4303-9E73-5E38BD0B28AF}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{336AAF8A-5316-4303-9E73-5E38BD0B28AF}.Release|x86.ActiveCfg = Release|x86
|
||||
{336AAF8A-5316-4303-9E73-5E38BD0B28AF}.Release|x86.Build.0 = Release|x86
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{9C5040DA-C739-43A1-8540-E6BD3ED6DB55}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// -----------------------------------------------------------------------
|
||||
// <copyright file="IVoronoi.cs" company="">
|
||||
// Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/
|
||||
// </copyright>
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
namespace TriangleNet.Tools
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
/// <summary>
|
||||
/// TODO: Update summary.
|
||||
/// </summary>
|
||||
public interface IVoronoi
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -83,6 +83,7 @@
|
||||
<Compile Include="Smoothing\ISmoother.cs" />
|
||||
<Compile Include="Tools\BoundedVoronoi.cs" />
|
||||
<Compile Include="Tools\CuthillMcKee.cs" />
|
||||
<Compile Include="Tools\IVoronoi.cs" />
|
||||
<Compile Include="Tools\QualityMeasure.cs" />
|
||||
<Compile Include="Tools\Statistic.cs" />
|
||||
<Compile Include="Algorithm\SweepLine.cs" />
|
||||
|
||||
Reference in New Issue
Block a user