у меня вопрос. как определить что отрезок прямой. звучит тупо. И вопрос 5 класса наверн. Я знаю что можно Atan2 найти угол отрезка.
Мне нужно, что бы алгоритм брал только диагонали, а не прямые отрезки (углы 0,90,180,270, 360 не должен брать). Пробовал и радианы и градусы.
function AngleVector takes real x1, real y1, real x2, real y2 returns real
    return Atan2(y2 - y1, x2 - x1)
endfunction
 set Angle = AngleVector(Ax, Ay, Vx2[F1], Vy2[F1])* bj_RADTODEG
            
//0 = 0 или 360; 3.142 = 180; 1.571 = 90; -1.571 = 270
 if (Angle != 0) or (Angle != 360.) or (Angle != -360.) or (Angle != 180.) or (Angle != -180.) or (Angle != 90.) or (Angle != -90.) then
	//показать дебагом угол
else
	//вывести дебаг ошибку
endif
У меня почему-то получается угол отрицательный -90. А по условию проходит. это тупо.
Благо только сейчас заметил что не работает проверка, как только написал отладку. Видать что-то другое к счастью не допустило отрезок. У меня там еще несколько проверок.
Мб надо сравнивать координаты? типа x1 == x2 или y1 == y2 значит угол прямой?

Равно в варике округляет, а вот неравно - нет. У тебя и выводит 90.000, потому что R2S округляет до 3-го знака, а на самом деле там было что-то вроде 89.999999. 90 != 89.999999 в варике, потому условие прошло. Хочешь, чтобы не прошло, используй not (90 == angle). Тогда 89.999999 округлится до 90 и условие не пройдёт.

Либо используй то, что показал Скорп, тоже подойдёт.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
Равно в варике округляет, а вот неравно - нет. У тебя и выводит 90.000, потому что R2S округляет до 3-го знака, а на самом деле там было что-то вроде 89.999999. 90 != 89.999999 в варике, потому условие прошло. Хочешь, чтобы не прошло, используй not (90 == angle). Тогда 89.999999 округлится до 90 и условие не пройдёт.

Либо используй то, что показал Скорп, тоже подойдёт.
Принятый ответ
38
PT153, до чего "==" округляет? Если будет 1e+9 то это будет равно 1.1e+9 ?
27
смотрите, использую.
не работает (вариант скорпа)
не срабатывает ни ложь, ни истина. глухота. мб из-за RAbsBJ, там типа тоже сравнение идет?
if (RAbsBJ(Ax - Vx2[F1]) < 0.00001) or (RAbsBJ(Ay - Vy2[F1]) < 0.00001) then
	call DisplayDebugTextToPlayer2("проверяем дальше")
else
	call DisplayDebugTextToPlayer2("2-точка не подходит")
endif
вариант PT153 работает (изменил условие)
38
можно попробовать точность 0.01, видимо в жасс оператор "==" это и делает
в любом случае, раз решено, то решено
38
втф, а скинь тот же код по методу PT153, который работает, мне самому уже интересно
27
вариант 1 (рабочий)
if not((Ax == Vx2[F1]) or (Ay == Vy2[F1])) then
endif
вариант 2 (рабочий)
if not((Angle == 0) or (Angle == 360.) or (Angle == -360.) or (Angle == 180.) or (Angle == -180.) or (Angle == 90.) or (Angle == -90.)) then 
endif
карта <= функция Trig_triigger_DU_2 в шапке. работает хорошо и норм щас
Загруженные файлы
28
до чего "==" округляет
Вроде до третьего знака. Сурс:
The only thing we changed is == to not != which should be logically equivalent, but in fact are not in Jass. It seems Blizzard wanted to make things "easier" for people when working with reals and therefore implemented the == for reals with some epsilon. However, they only did so for this operator, not for the other comparison operators like !=. This property was first reported by masda70 and is quantified here. I.e. the epsilon used by == must be somewhere around 0.001.
38
PT153, тем не менее явное сравнение с эпсилономту автора не работает даже с 0.01
Этот комментарий удален
28
ScorpioT1000, потому что он неправильно закодил.
Вот тесты, там видно, что сравнение по эпсилону работает как надо.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.