реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Геометрическая задачка - определить принадлежность точки к треугольнику в гексагоне, Подскажите алгоритм, а то запутался
Tanya
сообщение Mar 9 2010, 16:55
Сообщение #31


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(syoma @ Mar 9 2010, 17:15) *
По векторным произведениям не нашел применения в моем случае.

Знаки векторных произведений покажут, на какой стороне лежит искомая точка пересечения.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 9 2010, 20:00
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Tanya @ Mar 9 2010, 19:55) *
Знаки векторных произведений покажут, на какой стороне лежит искомая точка пересечения.

А можно итерациями с наперед заданной точностью найти координаты искомой точки.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Mar 10 2010, 03:42
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(syoma @ Mar 9 2010, 19:16) *
Даны координаты точки X,Y, которая лежит где-то за пределами гексагона. Надо найти координаты точки X',Y', которая должна находиться на границе и которая должна лежать на прямой 0,0 - X,Y.

Три прямых Y = 0; Y = X*tg(60°); Y = -X*tg(60°) разбивают плоскость на шесть равных секторов:

sector0: (X*tg(60°) <= Y)&&(-X*tg(60°) < Y)
sector1: (0 <= Y)&&(Y < X*tg(60°))
sector2: (-X*tg(60°) <= Y)&&(Y < 0)
sector3: (Y <= X*tg(60°))&&(Y < -X*tg(60°))
sector4: (Y <= 0)&&(X*tg(60°) < Y)
sector5: (0 < Y)&&(Y <= -X*tg(60°))

В прежних обозначениях:
Цитата(blackfin @ Feb 8 2010, 09:30) *

находим:

Код
void
scale(double X,double Y,double *X',double *Y')
{
    double PA = (Y*(2/a)/cos(30°)).
    double PB = (X*(2/a)+Y*(2/a)*tg(30°)).
    double PC = (X*(2/a)-Y*(2/a)*tg(30°)).

    double S0;
    double S1;
    double S2;
    double S3;
    double S4;
    double S5;

    if ((2.0 < abs(PA))||(2.0 < abs(PB))||(2.0 < abs(PC)))
    {
        if ((X*tg(60°) <= Y)&&(-X*tg(60°) < Y))
        {S0 = 2.0/PA;  *X' = S0*X; *Y' = S0*Y;}
        else if ((0 <= Y)&&(Y < X*tg(60°)))
        {S1 = 2.0/PB;  *X' = S1*X; *Y' = S1*Y;}
        else if ((-X*tg(60°) <= Y)&&(Y < 0))
        {S2 = 2.0/PC;  *X' = S2*X; *Y' = S2*Y;}
        else if ((Y <= X*tg(60°))&&(Y < -X*tg(60°)))
        {S3 = -2.0/PA; *X' = S3*X; *Y' = S3*Y;}
        else if ((Y <= 0)&&(X*tg(60°) < Y))
        {S4 = -2.0/PB; *X' = S4*X; *Y' = S4*Y;}
        else if ((0 < Y)&&(Y <= -X*tg(60°)))
        {S5 = -2.0/PC; *X' = S5*X; *Y' = S5*Y;}
        else printf("NAN error?");
    }
    return;
}
Go to the top of the page
 
+Quote Post
syoma
сообщение Mar 10 2010, 11:03
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Спасибо опять blackfin.
Опять упростилось и стало вообще без секторов. Просто тупо нахожу SX, которое минимально по модулю, да умножаю его на X,Y.
Теперь еще бы деление упразднить...
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 10 2010, 12:56
Сообщение #35


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(syoma @ Mar 10 2010, 14:03) *
Теперь еще бы деление упразднить...

А я Вам что предлагала?
Пусть для простоты Ваш вектор R лежит между двумя базисными векторами A и B.
Мы знаем (уже вычислили) два векторных произведения Вашего вектора и базисных. Искомая точка (вектор) выражается в виде A + a(B-A), при этом векторное произведение с R должно равняться нулю. (0<a<1)
Раз мы (Вы) не хотим использовать деление, то можем найти приближенное решение методом деления отрезка пополам - найдем a.
При этом, векторные произведения уже не нужно повторно искать - мы их помним.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01369 секунд с 7
ELECTRONIX ©2004-2016