public void Draw() { GL.PushMatrix(); GL.Translate(0, 0, -0.1); Vector3 p = device.GetPosition(); CoolDrawing.DrawCircle(12.5f, new OpenTK.Vector2(p.X * 1000, p.Y * 1000), Color.DarkGreen); for (int i = 0; i < commands.Count(); i++) { if (commands[i] is MoveTool) { MoveTool m = commands[i] as MoveTool; Vector3 finalPosition = m.FinalPosition(); CoolDrawing.DrawCircle(5.0f, new Vector2(finalPosition.X * 1000, finalPosition.Y * 1000), Color.Blue); } } for (int i = 0; i < previousPoints.Count(); i++) { double age = DateTime.Now.Subtract(previousPoints[i].createTime).TotalMilliseconds; if (age > 5000) { previousPoints.RemoveAt(i); i--; } else { int alpha = (int)(255 - 255 * age / 5000.0f); CoolDrawing.DrawCircle(5.0f, new Vector2(previousPoints[i].location.X * 1000, previousPoints[i].location.Y * 1000), Color.FromArgb(alpha, Color.DarkGreen)); } } float w = 0; // Assume full bit penetrates at 20 mills depth if (p.Z < 0) { w = -p.Z / .020f * 12.5f; if (w > 12.5f) { w = 12.5f; } CoolDrawing.DrawFilledCircle(w, new OpenTK.Vector2(p.X * 1000, p.Y * 1000), Color.FromArgb(100, Color.OrangeRed)); if (p.Z < -.020) { float t = (p.Z + .020f) / .040f * 12.5f; CoolDrawing.DrawFilledCircle(t, new OpenTK.Vector2(p.X * 1000, p.Y * 1000), Color.FromArgb(100, Color.DarkRed)); } } else { w = p.Z / move_height * 12.5f; CoolDrawing.DrawFilledCircle(w, new OpenTK.Vector2(p.X * 1000, p.Y * 1000), Color.FromArgb(100, Color.LightGreen)); } GL.PopMatrix(); }
public override void Draw() { for (int i = 0; i < (Points.Count - 1); i++) { Color c = Color.OrangeRed; CoolDrawing.DrawLine(width, new Vector2(Points[i].X, Points[i].Y), new Vector2(Points[i + 1].X, Points[i + 1].Y), c); CoolDrawing.DrawFilledCircle(width / 2, new Vector2(Points[i].X, Points[i].Y), c); } CoolDrawing.DrawFilledCircle(width / 2, center, Color.LightGreen); CoolDrawing.DrawCircle(width / 2, center, Color.Black); }
public void Draw() { double pitch = 80; double tooth_width = 45; // outside tooth width (part that fits into the pulley) double c = this.teeth * pitch; double r = (c / (2 * Math.PI)); for (int i = 0; i < this.teeth; i++) { double theta_total = ((double)1 / (double)this.teeth) * 2.0 * Math.PI; double theta_b = (tooth_width / pitch) * theta_total; double theta_a = (theta_total - theta_b) / 2.0; double theta_start = (double)i * theta_total; Vector2 a1 = new Vector2((float)(Math.Cos(theta_start) * r), (float)(Math.Sin(theta_start) * r)); Vector2 a2 = new Vector2((float)(Math.Cos(theta_start + theta_a) * r), (float)(Math.Sin(theta_start + theta_a) * r)); Vector2 a3 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b) * r), (float)(Math.Sin(theta_start + theta_a + theta_b) * r)); Vector2 a4 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b + theta_a) * r), (float)(Math.Sin(theta_start + theta_a + theta_b + theta_a) * r)); double w = (Math.Tan(tooth_taper_angle) * tooth_depth) / pitch * theta_total; Vector2 b1 = new Vector2((float)(Math.Cos(theta_start + theta_a + w) * (r - tooth_depth)), (float)(Math.Sin(theta_start + theta_a + w) * (r - tooth_depth))); Vector2 b2 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b - w) * (r - tooth_depth)), (float)(Math.Sin(theta_start + theta_a + theta_b - w) * (r - tooth_depth))); CoolDrawing.DrawLine(1, a2 + this.Center, b1 + this.Center, Color.DarkBlue); CoolDrawing.DrawLine(1, b1 + this.Center, b2 + this.Center, Color.Red); CoolDrawing.DrawLine(1, b2 + this.Center, a3 + this.Center, Color.DarkBlue); CoolDrawing.DrawLine(1, a1 + this.Center, a2 + this.Center, Color.Red); CoolDrawing.DrawLine(1, a3 + this.Center, a4 + this.Center, Color.DarkGreen); Vector2 p1 = new Vector2((float)(Math.Cos(theta_start) * radius), (float)(Math.Sin(theta_start) * radius)); Vector2 p2 = new Vector2((float)(Math.Cos(theta_start) * r), (float)(Math.Sin(theta_start) * r)); CoolDrawing.DrawLine(1, this.Center + p1, p2 + this.Center, Color.Black); } CoolDrawing.DrawCircle(radius, Center, Color.Black); foreach (Rout rout in this.GetRouts()) { rout.Draw(); } CoolDrawing.DrawFilledCircle(width / 2, Center, Color.LightGreen); CoolDrawing.DrawCircle(width / 2, Center, Color.Black); }
public virtual void Draw() { if (is_display_list_good) { GL.CallList(displayList); } else { if (displayList < 0) { displayList = GL.GenLists(1); } GL.NewList(displayList, ListMode.CompileAndExecute); List <CoolDrawing.Line> lines = new List <CoolDrawing.Line>(); if (Points.Count >= 2) { for (int i = 0; i < (Points.Count - 1); i++) { lines.Add(new CoolDrawing.Line(new Vector2(Points[i].X, Points[i].Y), new Vector2(Points[i + 1].X, Points[i + 1].Y))); } CoolDrawing.DrawDepthLine(width, lines.ToArray(), this.Depth); } for (int i = 0; i < Points.Count; i++) { Vector2 p = Points[i]; if (closestIsPoint && (i == closestPoint) && isMouseLDown) { CoolDrawing.DrawFilledCircle(width / 2, new Vector2(p.X, p.Y), Color.FromArgb(100, Color.Purple)); } else { //CoolDrawing.DrawFilledCircle(width / 2, new Vector2(p.X, p.Y), Color.White); } CoolDrawing.DrawCircle(width / 2, new Vector2(p.X, p.Y), Color.Black); } GL.EndList(); is_display_list_good = true; } }
private void ComputePoints() { outerRout = new Rout(); outerRout.Width = width; outerRout.Depth = depth; double pitch = 80; double tooth_width = 45; // outside tooth width (part that fits into the pulley) double c = this.teeth * pitch; double r = (c / (2 * Math.PI)); double tr = this.width / 2; // tool radius for (int i = 0; i < this.teeth; i++) { //double pulley_tooth_center = (double)i; double theta_total = ((double)1 / (double)this.teeth) * 2.0 * Math.PI; double theta_b = (tooth_width / pitch) * theta_total; double theta_a = (theta_total - theta_b) / 2.0; double theta_start = (double)i * theta_total; Vector2 a1 = new Vector2((float)(Math.Cos(theta_start) * r), (float)(Math.Sin(theta_start) * r)); Vector2 a2 = new Vector2((float)(Math.Cos(theta_start + theta_a) * r), (float)(Math.Sin(theta_start + theta_a) * r)); Vector2 a3 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b) * r), (float)(Math.Sin(theta_start + theta_a + theta_b) * r)); Vector2 a4 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b + theta_a) * r), (float)(Math.Sin(theta_start + theta_a + theta_b + theta_a) * r)); double w = (Math.Tan(tooth_taper_angle) * tooth_depth) / pitch * theta_total; Vector2 b1 = new Vector2((float)(Math.Cos(theta_start + theta_a + w) * (r - tooth_depth)), (float)(Math.Sin(theta_start + theta_a + w) * (r - tooth_depth))); Vector2 b2 = new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b - w) * (r - tooth_depth)), (float)(Math.Sin(theta_start + theta_a + theta_b - w) * (r - tooth_depth))); CoolDrawing.DrawLine(1, a2 + this.Center, b1 + this.Center, Color.DarkBlue); CoolDrawing.DrawLine(1, b1 + this.Center, b2 + this.Center, Color.Red); CoolDrawing.DrawLine(1, b2 + this.Center, a3 + this.Center, Color.DarkBlue); CoolDrawing.DrawLine(1, a1 + this.Center, a2 + this.Center, Color.Red); CoolDrawing.DrawLine(1, a3 + this.Center, a4 + this.Center, Color.DarkGreen); Vector2 p = new Vector2((float)(Math.Cos(theta_start) * r), (float)(Math.Sin(theta_start) * r)); CoolDrawing.DrawLine(1, this.Center, p + this.Center, Color.Black); // Tool Path double tw = tr * Math.Tan(0.25 * Math.PI - tooth_taper_angle / 2) / pitch * theta_total; Vector2 t1 = this.Center + new Vector2((float)(Math.Cos(theta_start) * (r + tr)), (float)(Math.Sin(theta_start) * (r + tr))); Vector2 t2 = this.Center + new Vector2((float)(Math.Cos(theta_start + theta_a + tw) * (r + tr)), (float)(Math.Sin(theta_start + theta_a + tw) * (r + tr))); Vector2 t3 = this.Center + new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b - tw) * (r + tr)), (float)(Math.Sin(theta_start + theta_a + theta_b - tw) * (r + tr))); Vector2 t4 = this.Center + new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b + theta_a) * (r + tr)), (float)(Math.Sin(theta_start + theta_a + theta_b + theta_a) * (r + tr))); Vector2 tb1 = this.Center + new Vector2((float)(Math.Cos(theta_start + theta_a + w + tw) * (r - tooth_depth + tr)), (float)(Math.Sin(theta_start + theta_a + w + tw) * (r - tooth_depth + tr))); Vector2 tb2 = this.Center + new Vector2((float)(Math.Cos(theta_start + theta_a + theta_b - w - tw) * (r - tooth_depth + tr)), (float)(Math.Sin(theta_start + theta_a + theta_b - w - tw) * (r - tooth_depth + tr))); //CoolDrawing.DrawLine((float)tr * 2, t1 + this.center, t2 + this.center, toolColor); //CoolDrawing.DrawLine((float)tr * 2, t2 + this.center, tb1 + this.center, toolColor); //CoolDrawing.DrawLine((float)tr * 2, tb1 + this.center, tb2 + this.center, toolColor); //CoolDrawing.DrawLine((float)tr * 2, tb2 + this.center, t3 + this.center, toolColor); //CoolDrawing.DrawLine((float)tr * 2, t3 + this.center, t4 + this.center, toolColor); outerRout.Points.Add(new Vector2(t1.X, t1.Y)); outerRout.Points.Add(new Vector2(t2.X, t2.Y)); outerRout.Points.Add(new Vector2(tb1.X, tb1.Y)); outerRout.Points.Add(new Vector2(tb2.X, tb2.Y)); outerRout.Points.Add(new Vector2(t3.X, t3.Y)); outerRout.Points.Add(new Vector2(t4.X, t4.Y)); } innerRout = new Rout(); innerRout.Width = width; innerRout.Depth = center_hole_depth; float circumference = (float)Math.PI * 2 * radius; //int _pointCount = pointCount; //if (_pointCount <= 1) //{ int _pointCount = (int)(0.5f * circumference / width); if (_pointCount <= 12) { _pointCount = 12; } for (int i = 0; i <= _pointCount; i++) { Vector2 p = new Vector2((float)(Math.Cos(Math.PI * 2 * i / _pointCount) * (radius - tr)), (float)(Math.Sin(Math.PI * 2 * i / _pointCount) * (radius - tr))); p += Center; innerRout.Points.Add(new Vector2(p.X, p.Y)); } //base.HasChanged = true; }
public void Draw() { float contact_circumference = circular_pitch * teeth; double contact_radius = contact_circumference / (Math.PI * 2); double base_radius = contact_radius * Cosd(pressure_angle); double outer_radius = contact_radius + addendum; double inner_radius = contact_radius - dedendum; CoolDrawing.DrawCircle((float)base_radius, Center, Color.Black); CoolDrawing.DrawCircle((float)contact_radius, Center, Color.Orange); CoolDrawing.DrawCircle((float)outer_radius, Center, Color.DarkBlue); CoolDrawing.DrawCircle((float)inner_radius, Center, Color.DarkBlue); double theta_to_contact_radius = Degrees(Sind(pressure_angle) / Cosd(pressure_angle)); List <Rout> Routs = new List <Rout>(); float a_radians = (float)(Math.PI * (0 - (theta_to_contact_radius - pressure_angle)) / 180.0f); // Draw an involute curve off the surface of the gear GL.Begin(BeginMode.LineStrip); GL.Color3(Color.Black); // Create routs to match the drawn line Rout rt = new Rout(); rt.Width = this.width; // Line from inner radius to start of base circle double sin_theta = (float)Math.Sin(a_radians); double cos_theta = (float)Math.Cos(a_radians); if (inner_radius < base_radius) { double x = inner_radius * cos_theta + this.X; double y = inner_radius * sin_theta + this.Y; GL.Vertex2(x, y); x = base_radius * cos_theta + this.X; y = base_radius * sin_theta + this.Y; GL.Vertex2(x, y); } // Degrees to rotate while drawing involute curve from base_radius to outer_radius float distance = (float)Degrees(Math.Sqrt(outer_radius * outer_radius - base_radius * base_radius) / base_radius); // Draw an involute line from base_radius to outer_radius for (double theta = 0; theta <= (distance + .0001); theta += (distance / 20.0f)) { Vector2 point = ComputeInvolutePoint(theta, Degrees(a_radians), base_radius, 0); GL.Vertex2(point + Center); } GL.End(); //outerRout.Draw(); foreach (Rout a in this.GetRouts()) { a.Draw(); } }