Yoko
http://forum.yoko.com.ua/

The Abyss, антимакрос
http://forum.yoko.com.ua/viewtopic.php?f=7&t=11884
Page 2 of 2

Author:  Destruction [ 2007-05-04 09:49:04 ]
Post subject: 

Grin wrote:
Как всегда ничего тут не изменилось;)
вот вечно через заднее место идут...
Дест тебе же уже предложили вариант который в несколько порядков будет быстрей работать и с 100% результатом. Я понимаю что ты ухватился за свое, но поверь - это глупо. Тем более есть есть проблемы с афинами преобразованиями. Найди одну формулу скалярного произведения векторов...

С афинными преобразованиями я уже разобрался, вроде :)

Не видел никаких вариантов, не покажешь ?..

Скажите мне, что делать - я это сделаю, мне не важно, как решать проблему, важно, чтобы это было эффективно.

Author:  Destruction [ 2007-05-04 09:49:37 ]
Post subject: 

Sanch wrote:
Попробовать стоит, возможно гениальность решения кроется в простоте.

Я около 3 часов тестировал их антимакро.

Ещё вопросы есть?

Author:  Destruction [ 2007-05-04 09:55:55 ]
Post subject: 

Перечитал тему - видел вариант только с перебивкой всех вариантов.. :)

Вариант действительно действенный, но реализация предполагает три варианта (как мне кажеться):
1. Хранить инфу в памяти инжы, что будет съедать кучу памяти.
2. Хранить инфу в реестре - что захламляеет реестр, но позволяет быстро и удобно вытаскивать нужные данные,
3. Хранить инфу в файлах - оттуда вытаскивать её ещё сложнее и дольше.

Я бы выбрал второй вариант, чтобы особо не вешать инжу захлаямлением памяти, впринципе - вариант вполне реальный, могу написать скриптик - будите сидеть нон-стоп цифры вводить, пока все не поперевводите (вариантов будет достаточно много) :roll:

А главное - решение будет коротким..

PS: Афинные преобразования заработали - синусы и косинусы местами перепутал, и ваще, не сразу понял, что это канонический алгоритм и на нуль мона намана поделить..

Вобщем вот, доразберусь с афинами, поеду в китай 8)

Моё решение, которое я хочу реализовать, предполагает, что на скриптах инжы, оно будет решаться не более 30 сек (по моим прикидкам и замерам), в завимимости от сложности предоставленного экземпляра.

Author:  Grin [ 2007-05-04 10:00:20 ]
Post subject: 

Grin wrote:
нарисуй цифры пронумеровав точки в порядке их появления. Порядок всегда один и тотже. Вспоминаем геометрию и выделяем в каждой цифре 2-3 уникальных угла образованных точками. Проверяем на соответствие на условие "Угол".
Чапра не примитивная (другую просто не нарисуешь), а вот способ ее подачи примитивен...

А это что?
Если не понятно, то
То все цифры ст роются в определенном порядке и этот порядок всегда один и тот же. Это не сравненной большой минус этого антимакра, так как теперь надо просто нарисовать все эти цифры пронумеровав точки в порядке их прорисовки. теперь начинаем анализировать цифры и мы видим что сочетание прямых углов в каждой цифре уникально...
А именно уникально из каких точек по номеру построена цифра. Достаточно выделить в цифре 2-3 таких угла и про на писать не большую процедуру проверки угла по 3-м точкам. Дальше оптимизируя алгоритм можно ускорить перебор возможных углов, так как нам уже дают подсказку среди каких цифр нам стоит искать и весь перебор с водится к проверки макс 2 цифр (если 3 цифра может быть получена путем исключения). Сей метод абсолютно не зависит на сколько и куда развернуты цифры.

ПС Так как матрица точек разворачивалась в дискретном пространстве то все координаты были округлены до целых, тоесть это может сказаться на тест "угла", но это будет очень не значительно.
Тест "Угла" проводитс по скалярному произведению векторов

ПСС только попробуй его продай;) прибью...

ПССС 30 сек?! и подсчитал же... То что выше будет работать доли секунды...

Author:  Destruction [ 2007-05-04 10:01:51 ]
Post subject: 

Пропустил пост, дважды.. странно.

Ща вдумаюсь..

Слушай, стуки в асю?) 119060..

Спрошу что-нить )

PS: Ммм, два Junior Expert'а, а разница в знаниях очевидна.. Гмм )

PPS: Всё равно было приятно разобраться с афинными преобразованиями.

PPPS: На JavaScript тоже будет доли секунды работать, фишка с арктангенсом и квадратным корнем 8)

Author:  Grin [ 2007-05-04 10:10:00 ]
Post subject: 

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

Author:  Destruction [ 2007-05-04 10:11:30 ]
Post subject: 

Grin wrote:
Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.

Ява и яваскрипт штука разная, яву я пока не изучил :)

А насчёт работающих алгоритмов я уже приступил к осмысливанию того, что ты написал :)

PS: Харэ редактить свои посты :roll:

Author:  Destruction [ 2007-05-04 10:56:28 ]
Post subject: 

Раз уж мне все всё так подробно расписали - буду тоже всё подробно расписывать и даже подробнее :)

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

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

Пусть у нас есть три точки, которые образуют угол:
Code:
M1 ( x1, y1 ) - непосредственно угловая точка
M2 ( x2, y2 ) - первая точка, из которой будет идти луч в точку M1
M3 ( x3, y3 ) - вторая точка, из которой будет идти луч в точку M1


Соответсвенно имеем два вектора: M1M2, M1M3.
Вектор понятное дело имеет свои координаты:
Code:
M1M2 ( x2 - x1, y2 - y1 )
M1M3 ( x3 - x1, y3 - y1 )


Обзавём координаты как-нибудь покороче:
Code:
X1 = x2 - x1
Y1 = y2 - y1
X2 = x3 - y1
Y2 = y3 - y1


Теперь немного теории:
Quote:
Скалярным произведением двух векторов называется сумма произведений одноименных координат этих векторов.

Т.е. в нашем случае:
Code:
M1M2 * M1M3 = X1 * X2 + Y1 * Y2


Кроме того:
Quote:
Скалярным произведением двух векторов в ДПСК (декартовой прямоугольной системе координат) называется произведение модулей этих двух векторов на косинус угла между ними.

Т.е.:
Code:
M1M2 * M1M3 = |M1M2| * |M1M3| * cos(f)

Примечание: f - так я обозвал угол, который мы ищем.

Далее - модуль вектора, тоже штука нужная, тоже нужно знать:
Quote:
Модулем вектора в ДПСК называется квадратный корень из суммы квадратов координат вектора.

Code:
|M1M2| = sqrt( X1^2 + Y1^2 )
|M1M3| = sqrt( X2^2 + Y2^2 )


Ну и непосредственный ответ, на поставленный вопрос:
Code:
cos( f ) = ( M1M2 * M1M3 ) / ( |M1M2| * |M1M3| )


Всё, дальше арифметика :)

PS: Grin. я всё верно описываю или можно как-нить попроще это намутить?)

Author:  Destruction [ 2007-05-04 11:28:29 ]
Post subject: 

Гмм, у меня глупый вопрос возник - а что делать с cos( f ) ?)

Author:  Grin [ 2007-05-04 11:51:43 ]
Post subject: 

Все верно... только не ясно почему возник глупый вопрос...
можно лишь бобавить что уго между векторами можно определить только в пределах от 0 до Пи тоесть до 180 градусов (домашние задание: объясните почему так...)
Чему равен косинус 90 градусов?
правельно... 0
Но так как я уже говорит идет округдение когдинат то с не большой погрешностью нужно расматривать этот самый прямой угол...
то есть у сло вие должно быть не строгое...

ПС Собствено близость косинуса к 0 говорит что Тест на "угол" пройден успешно... и даные точки составляют прямой угол

Author:  Nmy [ 2007-05-04 14:54:50 ]
Post subject: 

очистил
привет Грин
удачи Дестр :roll:

Author:  Destruction [ 2007-05-05 17:33:11 ]
Post subject: 

Grin wrote:
Все верно... только не ясно почему возник глупый вопрос...
можно лишь бобавить что уго между векторами можно определить только в пределах от 0 до Пи тоесть до 180 градусов (домашние задание: объясните почему так...)
Чему равен косинус 90 градусов?
правельно... 0
Но так как я уже говорит идет округдение когдинат то с не большой погрешностью нужно расматривать этот самый прямой угол...
то есть у сло вие должно быть не строгое...

ПС Собствено близость косинуса к 0 говорит что Тест на "угол" пройден успешно... и даные точки составляют прямой угол

Глупый-то оно конечно глупый, но я имел ввиду непосредственно, кароче забей)

PS: Времени нету - как-нибудь потом реализую всё это.

Author:  Grin [ 2007-05-05 17:35:01 ]
Post subject: 

ну вот а люди так ждали...

Author:  Destruction [ 2007-05-05 17:51:39 ]
Post subject: 

Grin wrote:
ну вот а люди так ждали...

Ну, говорят тебе дела.

Всё, что люядм нужно уже расписано, IMHO.

Author:  Grin [ 2007-05-06 13:49:26 ]
Post subject: 

Так тактика изменилась...
Кривизна цифр все таки очень кривая;) расхождения углов большое...
По этому начинаем оценивать какая из цифр больше всего похожа на то что в гампе... вводим бальную систему соответствия, та что больше всего похожа и есть наша цифра;)
выкладываю сам механизм "Узнавания цифры" (главная процедура what())
Code:
sub what()
   var i, score, num, temp, st
   dim x[11], y[11]
   dim nm[3]
   
   for i = 4 to 13
      st = uo.LastGump('command', i)
      x[i-3] = val(mid(st, 8, 3))
      y[i-3] = val(mid(st, 12, 3))
   next
   for i = 0 to 2
      nm[i] = val(uo.LastGump('text', i+1))
   next
   score = 10000
   index = 0
   for i = 0 to 2
      temp = numberscore(nm[i], x, y)
      if score > temp then
         score = temp
         index = i
      endif
   next
   uo.print(str(nm[index]))

end sub

sub numberscore(num, x, y)
   dim Sings[10]
   var cheking = 1
   var n, i, total = 0
   dim xv[2], yv[2], point[3]
   
   Sings[2] = "080910080506"
   Sings[3] = "040706060708"
   Sings[5] = "040506060708"
   Sings[6] = "070910050608"
   Sings[8] = "030506060709"
   Sings[9] = "040607050807"
   
   for n = 0 to 1
      for i = 0 to 2
         point[i] = val(mid(Sings[num], n*6+i*2, 2))
      next
      for i = 0 to 1
         xv[i] = x[point[i]]-x[point[i+1]]
         yv[i] = y[point[i]]-y[point[i+1]]
      next
      total = total+anglscore(xv, yv)
   next
   return total
endsub
      
sub anglscore(x, y)
   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))
end sub


ПС дальше ерунда осталась :roll:

Author:  Grin [ 2007-05-07 00:11:53 ]
Post subject: 

В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)
Code:
sub antimacro()

   var x, y
   
   while  not uo.Dead()
      if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0)  == 'Please choose this number:') then
         x = uo.LastGump('x')
         y = uo.LastGump('y')
         uo.LClick(x+120, y+185+what()*35)
         wait(1000)
      end if
      wait(100)
   wend

end sub
      
sub what()

   var i, score, index, temp, st
   dim x[11], y[11]
   dim nm[3]
   
   for i = 3 to 12
      st = uo.LastGump('command', i)
      x[i-2] = val(mid(st, 8, 3))
      y[i-2] = val(mid(st, 12, 3))
   next
   for i = 0 to 2
      nm[i] = val(uo.LastGump('text', i+1))
   next
   score = 10000
   index = 0
   for i = 0 to 2
      temp = numberscore(nm[i], x, y)
      if score > temp then
         score = temp
         index = i
      endif
   next
   return index

end sub

sub numberscore(num, x, y)

   dim Sings[10]
   var cheking = 1
   var n, i, total = 0
   dim xv[2], yv[2], point[3]
   
   Sings[2] = "080910080506"
   Sings[3] = "040706060708"
   Sings[5] = "040506060708"
   Sings[6] = "070910050608"
   Sings[8] = "030506060709"
   Sings[9] = "040607050807"
   
   for n = 0 to 1
      for i = 0 to 2
         point[i] = val(mid(Sings[num], n*6+i*2, 2))
      next
      for i = 0 to 1
         xv[i] = x[point[i]]-x[point[i+1]]
         yv[i] = y[point[i]]-y[point[i+1]]
      next
      total = total+anglscore(xv, yv)
   next
   return total

endsub
      
sub anglscore(x, y)

   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))

end sub

Author:  I'm [ 2007-05-07 13:06:19 ]
Post subject: 

Браво Grin :D
Destruction wrote:
Осталось стереть пост и продавать :D

И не надейся :)

Author:  Destruction [ 2007-05-09 22:19:02 ]
Post subject: 

Проблема имеет место быть.

Виновата строка:
Code:
if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0),  == 'Please choose this number:') then 


Вот так лучше будет:
Code:
if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0)  == 'Please choose this number:') then 


PS: Исправил пост грина.

Author:  caH4o [ 2019-11-03 04:45:54 ]
Post subject:  Re:

Grin wrote:
В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)
Code:
      
sub anglscore(x, y)

   var xy1 = x[0]*y[0]
   var xy2 = x[1]*y[1]
   var t = xy1+xy2
   
   x[0] = x[0]+y[0]
   x[1] = x[1]+y[1]
   return 100*t*t/((x[0]*x[0]-2*xy1)*(x[1]*x[1]-2*xy2))

end sub


Удивительно если он вообще работал... или это специальная ошибка из разряда защиты от любителей скопировать\вставить не разбираясь в макросе :roll:

За саму идею аплодирую стоя!)

Page 2 of 2 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/