(изменено: Валерий Осипов, 15 апреля 2013г. 11:11:33)

Тема: Проверка пересечений полилиний

Добрый день.

Нужно проверить, не пересекаются ли полилинии, если пересекаются, найти область пересечения.
Полилинии могут иметь общие границы, в данном контексте это пересечением не считается

Пробовал воспользоваться алгоритмом отсюда, но он работает, только если в пересекаемом контуре есть точка искомой полилинии.
Проверка пересечений полилиний

А если пересечение такое, то алгоритм его не видит.
Проверка пересечений полилиний.

Как я понимаю, нужно как-то выполнить операцию "Пересечение" из теории множеств, и, если результирующая площадь не равна нулю, значит полилинии пересекаются.

Как это можно сделать в автокаде, используя .NET API ?

Re: Проверка пересечений полилиний

вот здесь глянь клац
IntersectWith поможет

Re: Проверка пересечений полилиний

Или так

   [CommandMethod("care")] 
        public void checkAreasIntersect()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            bool yeah=false;
            using (Transaction tr = doc.TransactionManager.StartTransaction())
            {

                ObjectId id1 = ObjectId.Null;
                ObjectId id2 = ObjectId.Null;

                PromptEntityOptions peo = new PromptEntityOptions("\nSelect first area >>");
                peo.SetRejectMessage("\nSelect Polyline only");
                peo.AddAllowedClass(typeof(Polyline), false);
                PromptEntityResult res;
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK) return;
                id1 = res.ObjectId;

                peo.Message = "\nSelect second area >>";
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK) return;
                id2 = res.ObjectId;
               
                        Entity en1 = tr.GetObject(id1, OpenMode.ForWrite) as Entity;
                        if (en1 == null) return;

                        Entity en2 = tr.GetObject(id2, OpenMode.ForRead) as Entity;
                        if (en1 == null) return;

                        DBObjectCollection exids = new DBObjectCollection();
                        en1.Explode(exids);

                        foreach (DBObject obj in exids)
                        {
                            Entity en = obj as Entity;
                            Point3dCollection pts= new Point3dCollection();

                            en.IntersectWith(en2, Intersect.OnBothOperands, pts, 0, 0);
                            if (pts.Count != 0) {  yeah=true;break;  } 
                          
                            }
                        ed.WriteMessage("\nAreas are {0} an intersection {1:f3}", yeah ? "has" : "doesn't have",pts[0]);
                        }

                    }

Re: Проверка пересечений полилиний

а что значит Intersect.OnBothOperands и прочие типы Insersect ?

Re: Проверка пересечений полилиний

Из файла arxdoc:

AcDb::Intersect Enum The header file acdbabb.h contains const definitions for the Intersect values so that they can be used without the "AcDb::" scope resolution qualifier. This should only be used when you are certain there will be no name conflicts.

Intersect Name Declared Value Description
kOnBothOperands 0   
kExtendThis 1   
kExtendArg 2   
kExtendBoth 3

Re: Проверка пересечений полилиний

Валерий Осипов пишет:

а что значит Intersect.OnBothOperands и прочие типы Insersect ?

Достаточно знания английского:
OnBothOperands - пересечение принадлежит обоим примитивам
ExtendThis - этот примитив может быть удлинён для проверки пересечения
(т.е. например, отрезок рассматривается в качестве бесконечной прямой)
ExtendArg - второй примитив (с которым мы находим пересечения) может быть удлинён для проверки пересечения.
ExtendBoth - оба примитива могут быть удлинены для проверки.

Re: Проверка пересечений полилиний

fixo, спасибо, похоже работает как надо.

Александр Ривилис, спасибо, так понятнее)

Re: Проверка пересечений полилиний

Валерий Осипов пишет:

fixo, спасибо, похоже работает как надо.

Пожалуйста,
кстати попробуй заменить

typeof(Polyline)

на

typeof(Curve)


по идее должно работать с любыми типами кривых

Re: Проверка пересечений полилиний

Не все так хорошо, как показалось на первый взгляд =(.
Если участки пристыкованы друг к другу и в каком-то месте один налезает на другой, алгоритм этого не видит, т.к. пересечения кривых нет. Однако есть пересечение полигонов, что и требуется найти.
Проверка пересечений полилиний

Какие-нибудь идеи? Пока представляю это так:

Проверка пересечения (плиния1, плиния2)
{
    кривые1 = плиния1.РазбитьНаКривые();
    для каждой кривой из кривые1
    {
        если кривая пересекается с плиния2
        {
            если она не пристыкована к одной из ее граней (не параллельна) // ????
            {
                найти и выделить точки пересечения
            }
        }
    }
}