private void sheet_MouseClick(object sender, MouseEventArgs e) { //если нажата кнопка "выбрать вершину", ищем степень вершины if (selectButton.Enabled == false) { /* for (int i = 0; i < V.Count; i++) * { * if (Math.Pow((V[i].x - e.X), 2) + Math.Pow((V[i].y - e.Y), 2) <= G.R * G.R) * { * if (isClick) * { * G.drawVertex(e.X, e.Y, V[i].ToString()); * sheet.Image = G.GetBitmap(); * //V[i].x = e.X - V[i].x; * // V[i].y = e.Y - V[i].y; * } * * } * }*/ } // если нажата кнопка "рисовать вершину" if (drawVertexButton.Enabled == false) { V.Add(new Vertex(e.X, e.Y)); G.drawVertex(e.X, e.Y, V.Count.ToString()); sheet.Image = G.GetBitmap(); } //если нажата кнопка "рисовать ребро" if (drawEdgeButton.Enabled == false) { if (e.Button == MouseButtons.Left) { for (int i = 0; i < V.Count; i++) { if (Math.Pow((V[i].x - e.X), 2) + Math.Pow((V[i].y - e.Y), 2) <= G.R * G.R) { if (selected1 == -1) { G.drawSelectedVertex(V[i].x, V[i].y); selected1 = i; sheet.Image = G.GetBitmap(); break; } if (selected2 == -1) { G.drawSelectedVertex(V[i].x, V[i].y); selected2 = i; E.Add(new Edge(selected1, selected2)); G.drawEdge(V[selected1], V[selected2], E[E.Count - 1]); selected1 = -1; selected2 = -1; sheet.Image = G.GetBitmap(); break; } } } } if (e.Button == MouseButtons.Right) { if ((selected1 != -1) && (Math.Pow((V[selected1].x - e.X), 2) + Math.Pow((V[selected1].y - e.Y), 2) <= G.R * G.R)) { G.drawVertex(V[selected1].x, V[selected1].y, (selected1 + 1).ToString()); selected1 = -1; sheet.Image = G.GetBitmap(); } } } //если нажата кнопка "удалить элемент" if (deleteButton.Enabled == false) { bool flag = false; //удалили ли что-нибудь по ЭТОМУ клику //ищем, возможно была нажата вершина for (int i = 0; i < V.Count; i++) { if (Math.Pow((V[i].x - e.X), 2) + Math.Pow((V[i].y - e.Y), 2) <= G.R * G.R) { for (int j = 0; j < E.Count; j++) { if ((E[j].v1 == i) || (E[j].v2 == i)) { E.RemoveAt(j); j--; } else { if (E[j].v1 > i) { E[j].v1--; } if (E[j].v2 > i) { E[j].v2--; } } } V.RemoveAt(i); flag = true; break; } } // ищем, возможно было нажато ребро if (!flag) { for (int i = 0; i < E.Count; i++) { if (E[i].v1 == E[i].v2) //если это петля { if ((Math.Pow((V[E[i].v1].x - G.R - e.X), 2) + Math.Pow((V[E[i].v1].y - G.R - e.Y), 2) <= ((G.R + 2) * (G.R + 2))) && (Math.Pow((V[E[i].v1].x - G.R - e.X), 2) + Math.Pow((V[E[i].v1].y - G.R - e.Y), 2) >= ((G.R - 2) * (G.R - 2)))) { E.RemoveAt(i); G.DelWT(i); flag = true; break; } } else //не петля { if (((e.X - V[E[i].v1].x) * (V[E[i].v2].y - V[E[i].v1].y) / (V[E[i].v2].x - V[E[i].v1].x) + V[E[i].v1].y) <= (e.Y + 4) && ((e.X - V[E[i].v1].x) * (V[E[i].v2].y - V[E[i].v1].y) / (V[E[i].v2].x - V[E[i].v1].x) + V[E[i].v1].y) >= (e.Y - 4)) { if ((V[E[i].v1].x <= V[E[i].v2].x && V[E[i].v1].x <= e.X && e.X <= V[E[i].v2].x) || (V[E[i].v1].x >= V[E[i].v2].x && V[E[i].v1].x >= e.X && e.X >= V[E[i].v2].x)) { G.DelWT(i); E.RemoveAt(i); flag = true; break; } } } } } //если что-то было удалено, то обновляем граф на экране if (flag) { G.clearOne(); G.drawALLGraph(V, E); sheet.Image = G.GetBitmap(); } } }