Как получить у IEllipseArc координаты начала и конца дуги?

Автор Doom, 23.08.23, 16:01:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Doom

Здравствуйте!

Как получить у IEllipseArc координаты начала и конца дуги?


Дмитрий22

Это высшая математика. Я когда писал программу анализа замкнутости контура ни одну ночь просидел над этой задачей. Разберешься в моем коде, будешь молодец, я сейчас уже не вспомню, что там к чему.
foreach (IEllipseArc LS in drawCont.EllipseArcs)
            {
                if (LS.Style == 1)
                {

                    IEllipseArc LS2 = drawCont2.EllipseArcs.Add();
                    LS2.Xc = LS.Xc;
                    LS2.Yc = LS.Yc;
                    LS2.Angle = LS.Angle;
                    LS2.Angle1 = LS.Angle1;
                    LS2.Angle2 = LS.Angle2;
                    LS2.Direction = LS.Direction;
                    LS2.SemiAxisA = LS.SemiAxisA;
                    LS2.SemiAxisB = LS.SemiAxisB;
                    LS2.T1 = LS.T1;
                    LS2.T2 = LS.T2;
                    LS2.Update();

                    double xx = 0, yy = 0, xx8 = 0, yy8 = 0;
                    xx = LS2.SemiAxisA * Math.Cos(LS2.T1);
                    yy = LS2.SemiAxisB * Math.Sin(LS2.T1);
                    xx8 = LS2.SemiAxisA * Math.Cos(LS2.T2);
                    yy8 = LS2.SemiAxisB * Math.Sin(LS2.T2);

                    double lenght1 = Math.Sqrt(yy * yy + xx * xx);
                    double lenght2 = Math.Sqrt(yy8 * yy8 + xx8 * xx8);
                    double Angl2 = Math.Acos(xx / (lenght1));
                    Angl2 = Angl2 * 180 / 3.14;
                    double Angl4 = Math.Acos(xx8 / (lenght2));
                    Angl4 = Angl4 * 180 / 3.14;
                    double xx3 = 0;
                    double yy3 = 0, yy4 = 0;
                    if (LS2.Angle1 % 360 <= 180)
                    {
                        xx3 = LS2.Xc + lenght1 * Math.Cos((Angl2 + LS2.Angle) * 3.14 / 180);
                        yy3 = LS2.Yc + lenght1 * Math.Sin((Angl2 + LS2.Angle) * 3.14 / 180);
                    }
                    else
                    {
                        xx3 = LS2.Xc - lenght1 * Math.Cos((Angl2 + LS2.Angle) * 3.14 / 180);
                        yy3 = LS2.Yc - lenght1 * Math.Sin((Angl2 + LS2.Angle) * 3.14 / 180);
                    }
                    double xx4 = 0;

                    if (LS2.Angle2 % 360 <= 180)
                    {
                        xx4 = LS2.Xc + lenght2 * Math.Cos((Angl4 + LS2.Angle) * 3.14 / 180);
                        yy4 = LS2.Yc + lenght2 * Math.Sin((Angl4 + LS2.Angle) * 3.14 / 180);
                    }

                    else
                    {
                        xx4 = LS2.Xc - lenght2 * Math.Cos((Angl4 + LS2.Angle) * 3.14 / 180);
                        yy4 = LS2.Yc - lenght2 * Math.Sin((Angl4 + LS2.Angle) * 3.14 / 180);
                    }
                    Point t1, t2;
                    t1.x = (float)xx3; t1.y = (float)yy3; t2.x = (float)xx4; t2.y = (float)yy4;
                }
+ Благодарностей: 1

Scull_

Все одинаково, что отрезок, что дуга эллипса, только переменные разные.

Doom

Дмитрий22 спасибо!
Аналитическая геометрия это первое что приходит на ум но практика мне говорит что в конечном результате можно прийти к значительным расхождениям если только как то округлять или у меня что то не так складываются значения.

Цитата: Scull_ от 23.08.23, 17:28:48Все одинаково, что отрезок, что дуга эллипса, только переменные разные.
IEllipseArc не имеет координат как у дуги окружности IArc::X1;Y1.
 
Я решил по простому пути:

    # --------- ksDrArc / ksDrEllipseArc / ksDrLineSeg
    Uncnownobj_ = drawing_container.Objects(const_2d_.ksDrEllipseArc)
   
    for iobject in Uncnownobj_:
        drawingObject = KAPI7.IDrawingObject(iobject)
        drawingObject1 = KAPI7.IDrawingObject1(drawingObject)
       
        iCurve2D = drawingObject1.GetCurve2D()
        print(iCurve2D.Length)
       
        sarr_ = iCurve2D.CalculatePolygonByStep(iCurve2D.Length)
       
        # координты начальной точки линии/кривой
        point1_X = sarr_[0]
        point1_Y = sarr_[1]
       
        endindex = len(sarr_) - 1
       
        # координты конечной точки линии/кривой
        point2_X = sarr_[endindex-1]
        point2_Y = sarr_[endindex]


Вират Лакх

ЦитироватьdrawingObject = KAPI7.IDrawingObject(iobject)
drawingObject1 = KAPI7.IDrawingObject1(drawingObject)
Должно работать в одно действие: сразу drawingObject1 от iobject

Doom

Дмитрий22,

Не подскажите ли книгу в которой сосредоточен максимум из аналитической геометрии ? нахожу материалы - обрывками. Я когдато получил книгу на 5600  с чем то страниц там было собрано многое из аналитической геометрии но не совсем книга а просто сборка и при чем это был 1 том. 2009 год. Но она канула в Лету вместе с диском.

Scull_


Doom

Цитата: Scull_ от 26.08.23, 14:11:11В чем проблема, тяжело посчитать.
Вопрос не по теме, а как бы обобщённый.

Вот вы сходу можете рассчитать точку пересечения 3 пространственных поверхностей заданными функциями? (Не средствами САПРа) 

Только математические исчисления там дифференциальные интегральные и комбинированные и тд и тп

Doom

Данные с
sarr_ = iCurve2D.CalculatePolygonByStep(iCurve2D.Length)противоречат с значением IEllipseArc.Direction

Если только CalculatePolygonByStep начинает сбор точек с конца.

Мб IEllipseArc::Direction::True - против часовой стрелки?

Так же IEllipseArc.Direction противоречит значению Angle (Угол наклона первой полуоси)

Doom

#9
Решил поделить дугу эллипса на 4 равных частей
sarr_ = iCurve2D.CalculatePolygonByStep(iCurve2D.Length/4)
И он не делит не чего а точки что выдает по координатам не верны..

sarr_ = iCurve2D.CalculatePolygonByStep(iCurve2D.Length/10)
           
            # -----------------------------------------------------------------
            # постоянное число координат
            print(sarr_)
           
           
            for i in range(0, len(sarr_), 2):
                print(sarr_[i], sarr_[i+1])
                iDocument2D.ksPoint(sarr_[i], sarr_[i+1], 0)

Что я делаю не так ??

Попробовал через ksPointsOnCurve - делит верно.