1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Любителям кофе

Тема в разделе "Cinema 4D", создана пользователем -, 20 дек 2003.

  1. Guest

    Кто знает как преобразовать строку в число на coffee? Действие обратное tostring. Похоже что вообще нет :( но ведь это бред.
     
  2. Guest

    можно, можно...
    evaluate() - вычисляет значение строки и выдает результат типа float;
    ievaluate() - делает тоже самое, тока преобразует к типу integer;
    в качестве аргумента для этих функций можна задавать не только строку, содержащую число, например: evaluate("123.07"), а целое матемтатическое выражение, например:

    var str = "(0.07 - 0.03)*2 ";
    println( evaluate(str) / 0.04 );
     
  3. Guest

    Спасибо большое! :) Описалово evaluate в конце ссылается по See also на tostring а описалово tostring на evaluate почему то не ссылается :( поэтому я и подумал что такого нет.

    Слушай, Akam а не подскажешь следующее:
    Есть полигон и есть точка над ним. Как мне вычислить точку пересечения перпендикуляра из точки к полигону с этим полигоном?
     
  4. Guest

    Нижеследующая функция вычисляет координаты основания перпендикуляра, опущенного из точки на плоскость полигона.
    Функция возвращает результат типа vector.
    Аргументы функции:
    a - тип vector, координаты точки полигона;
    b - тип vector, координаты точки полигона;
    c - тип vector, координаты точки полигона;
    point - тип vector, координаты точки.


    ppCross(a,b,c,point)
    { var normal;
    var D,t,x1,y1,z1;

    normal = vnorm(vcross(vector(b.x-a.x, b.y-a.y, b.z-a.z),
    vector(c.x-a.x, c.y-a.y, c.z-a.z)));
    D = -(normal.x*a.x + normal.y*a.y + normal.z*a.z);
    t = -(normal.x*point.x + normal.y*point.y + normal.z*point.z + D)/
    (normal.x*normal.x + normal.y*normal.y + normal.z*normal.z);
    x1 = point.x + normal.x*t;
    y1 = point.y + normal.y*t;
    z1 = point.z + normal.z*t;
    return vector(x1,y1,z1);
    }

    Пример использования:
    Создаем полигон из четырех точек. Добавляем к нему 2 точки (они не присоединены ни к какому полигону). В результате получили 6 точек. Можно посмотреть их в Structure (Mode->Points).
    Правой кнопкой мыши на нашем полигоне в Object Manager, New Expression->C.O.F.F.E.E. Expression.
    В Expression Editor вводим следующее:

    ppCross(a,b,c,point)
    { var normal;
    var D,t,x1,y1,z1;

    normal = vnorm(vcross(vector(b.x-a.x, b.y-a.y, b.z-a.z),
    vector(c.x-a.x, c.y-a.y, c.z-a.z)));
    D = -(normal.x*a.x + normal.y*a.y + normal.z*a.z);
    t = -(normal.x*point.x + normal.y*point.y + normal.z*point.z + D)/
    (normal.x*normal.x + normal.y*normal.y + normal.z*normal.z);
    x1 = point.x + normal.x*t;
    y1 = point.y + normal.y*t;
    z1 = point.z + normal.z*t;
    return vector(x1,y1,z1);
    }

    main(doc,op)
    { var p1,p2,p3,pp;

    p1 = op->GetPoint(0);
    p2 = op->GetPoint(1);
    p3 = op->GetPoint(2);
    pp = op->GetPoint(4);
    op->SetPoint(5, ppCross(p1,p2,p3,pp));
    op->Message(MSG_UPDATE);
    }

    Теперь если выделить точку 4 и перемещать ее в пространстве, то точка 5 будет занимать положение основания перпендикуляра, опущенного из точки 4 на плоскость полигона.

    Да, у меня встречный вопрос. Каким образом можно узнавать, попала ли точка на полигон или нет?

    Вот файл сцены: http://oxygen-c4d.mail333.com/pp for SOD.zip
    В нем также двигаем точку, а вторая занимает положение основания перпендикуляра. При этом выводится сообщение, попала она на полигон или нет. Полигон, с которым работаем надо выделить.
    Так вот для среднего ряда четырехугольных полигонов все работает правильно. А для ряда выше или ниже - нет. Для верхних и нижних треугольных полигонов все тоже работает верно.
    Кому интересно, может посмотреть. Времени на поиск ошибки уже не осталось. Кто чего скажет?
     
  5. Guest

    Супер!!! Спасибо огромное!! Вечный тебе респект. По твоему вопросу постараюсь помочь в ближайшее время
     

Поделиться этой страницей