bool isSameLine(TinLine line1, TinLine line2) { if (((line1.id1 == line2.id1) && (line1.id2 == line2.id2)) || ((line1.id1 == line2.id2) && (line1.id2 == line2.id1))) { return(true); } return(false); }
bool isTwice(TinLine _line) { int lineCount = 0; for (int ii = 0; ii < linesArray.Count; ii++) { TinLine pTempLine = linesArray[ii]; if (isSameLine(pTempLine, _line)) { lineCount++; } } if (lineCount == 2) { return(true); } return(false); }
private void 画图ToolStripMenuItem_Click(object sender, EventArgs e) { //定义与第一点最近的点 double minDist = Distance(zbArray[0], zbArray[1]); double dis; int nearPtId = 1; for (int i = 0; i < zbArray.Count; i++) { dis = Distance(zbArray[0], zbArray[i]); if (dis < minDist) { minDist = dis; nearPtId = i; } } //if (nearPtId == -1) // return; //将第一条边反向已进行三角形扩展 TinLine tl = new TinLine(); tl.id1 = 0; tl.id2 = nearPtId; tl.Begin = zbArray[0]; tl.End = zbArray[nearPtId]; linesArray.Add(tl); for (int j = 0; j < linesArray.Count; j++) { //TinLine line = linesArray[j]; //if (isTwice(line)) // continue; double ang; double maxAngs = double.MinValue; int maxAngPtId = -1; bool ok = false; for (int i = 0; i < zbArray.Count; i++) { int youbian; //判断第三点与前两点的位置关系 youbian = ZuoYou(linesArray[j].Begin, linesArray[j].End, zbArray[i]); //youbian = ZuoYou(zbArray[linesArray[j].id1], zbArray[linesArray[j].id2], zbArray[i]); if (youbian == 1) { //获取角度最大点 ang = Angle(linesArray[j].Begin, linesArray[j].End, zbArray[i]); //ang = Angle(zbArray[linesArray[j].id1], zbArray[linesArray[j].id2], zbArray[i]); if (ang > maxAngs) { maxAngs = ang; maxAngPtId = i; } ok = true; } } if (ok == true) { TinLine tline1 = new TinLine(); TinLine tline2 = new TinLine(); //将新生成两条边添加入集合中 int t1 = 0; int t2 = 0; tline1.id1 = linesArray[j].id1; tline1.id2 = maxAngPtId; tline2.id1 = linesArray[j].id2; tline2.id2 = maxAngPtId; tline1.Begin = linesArray[j].Begin; tline1.End = zbArray[maxAngPtId]; tline2.Begin = zbArray[maxAngPtId]; tline2.End = linesArray[j].End; //将三角顶点的编号添加顶点集合中 tagTri Vertex = new tagTri(); Vertex.id1 = linesArray[j].id1; Vertex.id2 = linesArray[j].id2; Vertex.id3 = maxAngPtId; for (int i = 0; i < linesArray.Count; i++) { if ((tline1.Begin.x == linesArray[i].Begin.x && tline1.End.x == linesArray[i].End.x) || (tline1.Begin.x == linesArray[i].End.x && tline1.End.x == linesArray[i].Begin.x)) { t1 = 1; } if ((tline2.Begin.x == linesArray[i].Begin.x && tline2.End.x == linesArray[i].End.x) || (tline2.Begin.x == linesArray[i].End.x && tline2.End.x == linesArray[i].Begin.x)) { t2 = 1; } //if ((tline1.id1 == linesArray[i].id1 && tline1.id2 == linesArray[i].id2) || // (tline1.id1 == linesArray[i].id2 && tline1.id2 == linesArray[i].id1)) //{ // t1 = 1; //} //if ((tline2.id1 == linesArray[i].id1 && tline2.id2 == linesArray[i].id2) || // (tline2.id1 == linesArray[i].id2 && tline2.id2 == linesArray[i].id1)) //{ // t2 = 1; //} } if (t1 == 0) { linesArray.Add(tline1); VertexArray.Add(Vertex); } if (t2 == 0) { linesArray.Add(tline2); VertexArray.Add(Vertex); } if (t1 == 0 && t2 == 0) { VertexArray.Remove(Vertex); } } } #region //MessageBox.Show("Array length=" + linesArray.Count); //MessageBox.Show("VertexArray length=" + VertexArray.Count); //double minX = Double.MaxValue;//zbArray[0].x; //double minY = Double.MaxValue;// zbArray[0].y; //double maxX = Double.MinValue;//szbArray[0].x; //double maxY = Double.MinValue;// zbArray[0].y; //for (int i = 0; i < zbArray.Count; i++) //{ // double x0 = zbArray[i].x; // double y0 = zbArray[i].y; // if (x0 > maxX) // { // maxX = x0; // } // if (x0 < minX) // { // minX = x0; // } // if (y0 > maxY) // { // maxY = y0; // } // if (y0 < minY) // { // minY = y0; // } //} //double MapX = maxX - minX; //double MapY = maxY - minY; //double WinX = panel1.Width - 10; //double WinY = panel1.Height - 10; //double ScaleX = MapX / WinX; //double ScaleY = MapY / WinY; //TinLine1 tl1 = new TinLine1(); //Graphics g = panel1.CreateGraphics(); //panel1.Refresh(); //Pen pen = new Pen(Color.Red, 1); //for (int i = 0; i < linesArray.Count; i++) //{ // //tl1.Begin.X = (float)((zbArray[linesArray[i].id1].x - minX) / ScaleX); // //tl1.Begin.Y = (float)(WinY - (zbArray[linesArray[i].id1].y - minY) / ScaleY); // //tl1.End.X = (float)((zbArray[linesArray[i].id2].x - minX) / ScaleX); // //tl1.End.Y = (float)(WinY - (zbArray[linesArray[i].id2].y - minY) / ScaleY); // tl1.Begin.X = (float)((linesArray[i].Begin.x - minX) / ScaleX); // tl1.Begin.Y = (float)(WinY - (linesArray[i].Begin.y - minY) / ScaleY); // tl1.End.X = (float)((linesArray[i].End.x - minX) / ScaleX); // tl1.End.Y = (float)(WinY - (linesArray[i].End.y - minY) / ScaleY); // g.DrawLine(pen, tl1.Begin, tl1.End); // if (i<zbArray.Count) // { // float x = (float)((zbArray[i].x - minX) / ScaleX); // float y = (float)(WinY - (zbArray[i].y - minY) / ScaleY); // g.FillEllipse(Brushes.Black, x-3 ,y-3 , 6, 6); // } //} #endregion }