public bool ContainInArea(myVertex vertex) { if (ContainVertex(vertex,0) != -1) return true; double x_max = vertexes[0].X; for (int i = 1; i < vertexes.Count - 1; i++) if (vertexes[i].X > x_max) x_max = vertexes[i].X; x_max += 10; mySection luch = new mySection(vertex, new myVertex(x_max,vertex.Y)); int k = 0; for (int i = 0; i < vertexes.Count - 1; i++ ) { mySection section = new mySection(vertexes[i], vertexes[i + 1]); myVertex intersection = luch.Intersect(section); if (intersection != null) { k++; if (this.ContainVertex(intersection,0) != -1) i++; } } if (k>0 && k % 2 == 1) return true; else return false; }
private myPolygon GetIntersectionWith(myPolygon polygon) { //создадим результирующий многоугольник myPolygon result = new myPolygon(); for (int i = 0; i < vertexes.Count - 1; i++) { //добавим в него текущую вершину result.vertexes.Add(vertexes[i]); //создадим ребро, из текущей и следующей вершины mySection i_section = new mySection(vertexes[i], vertexes[i + 1]); //а так же список добавляемых вершин List<myVertex> vertexes_to_add = new List<myVertex>(); //будем искать пересечения for (int j = 0; j < polygon.vertexes.Count - 1; j++) { //текущее ребро во втором многоугольнике mySection j_section = new mySection(polygon.vertexes[j], polygon.vertexes[j + 1]); //если есть пересечение - добавим в список myVertex intersection = i_section.Intersect(j_section); if (intersection != null && result.ContainVertex(intersection,0) == -1 && !vertexes_to_add.Contains(intersection)) vertexes_to_add.Add(intersection); } //теперь нужно отсортировать список по удалению от начала отрезка //параллельно добавляя их в многоугольник-результат for (int j = 0; j < vertexes_to_add.Count; j++) { double min_distance = result.vertexes[result.vertexes.Count - 1].DistanceTo(vertexes_to_add[j]); for (int k = j + 1; k < vertexes_to_add.Count; k++) { double distance = result.vertexes[result.vertexes.Count - 1].DistanceTo(vertexes_to_add[k]); if (distance < min_distance) { myVertex temp = vertexes_to_add[j]; vertexes_to_add[j] = vertexes_to_add[k]; vertexes_to_add[k] = temp; min_distance = distance; } } result.vertexes.Add(vertexes_to_add[j]); } } //не забудем добавить самую первую точку result.vertexes.Add(result.vertexes[0]); return result; }