Page 2 of 2

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

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

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

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

Posted: 2007-05-04 09:49:37
by Destruction
Sanch wrote:Попробовать стоит, возможно гениальность решения кроется в простоте.

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

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

Posted: 2007-05-04 09:55:55
by Destruction
Перечитал тему - видел вариант только с перебивкой всех вариантов.. :)

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

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

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

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

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

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

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

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

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

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

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

Posted: 2007-05-04 10:01:51
by Destruction
Пропустил пост, дважды.. странно.

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

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

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

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

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

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

Posted: 2007-05-04 10:10:00
by Grin
Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.

Posted: 2007-05-04 10:11:30
by Destruction
Grin wrote:Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.

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

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

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

Posted: 2007-05-04 10:56:28
by Destruction
Раз уж мне все всё так подробно расписали - буду тоже всё подробно расписывать и даже подробнее :)

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

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

Пусть у нас есть три точки, которые образуют угол:

Code: Select all

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


Соответсвенно имеем два вектора: M1M2, M1M3.
Вектор понятное дело имеет свои координаты:

Code: Select all

M1M2 ( x2 - x1, y2 - y1 )
M1M3 ( x3 - x1, y3 - y1 )


Обзавём координаты как-нибудь покороче:

Code: Select all

X1 = x2 - x1
Y1 = y2 - y1
X2 = x3 - y1
Y2 = y3 - y1


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

Т.е. в нашем случае:

Code: Select all

M1M2 * M1M3 = X1 * X2 + Y1 * Y2


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

Т.е.:

Code: Select all

M1M2 * M1M3 = |M1M2| * |M1M3| * cos(f)

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

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

Code: Select all

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


Ну и непосредственный ответ, на поставленный вопрос:

Code: Select all

cos( f ) = ( M1M2 * M1M3 ) / ( |M1M2| * |M1M3| )


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

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

Posted: 2007-05-04 11:28:29
by Destruction
Гмм, у меня глупый вопрос возник - а что делать с cos( f ) ?)

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

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

Posted: 2007-05-04 14:54:50
by Nmy
очистил
привет Грин
удачи Дестр :roll:

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

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

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

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

Posted: 2007-05-05 17:35:01
by Grin
ну вот а люди так ждали...

Posted: 2007-05-05 17:51:39
by Destruction
Grin wrote:ну вот а люди так ждали...

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

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

Posted: 2007-05-06 13:49:26
by Grin
Так тактика изменилась...
Кривизна цифр все таки очень кривая;) расхождения углов большое...
По этому начинаем оценивать какая из цифр больше всего похожа на то что в гампе... вводим бальную систему соответствия, та что больше всего похожа и есть наша цифра;)
выкладываю сам механизм "Узнавания цифры" (главная процедура what())

Code: Select all

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:

Posted: 2007-05-07 00:11:53
by Grin
В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)

Code: Select all

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

Posted: 2007-05-07 13:06:19
by I'm
Браво Grin :D
Destruction wrote:Осталось стереть пост и продавать :D

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

Posted: 2007-05-09 22:19:02
by Destruction
Проблема имеет место быть.

Виновата строка:

Code: Select all

if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0),  == 'Please choose this number:') then 


Вот так лучше будет:

Code: Select all

if (uo.LastGump('replyed') == 0) and (uo.LastGump('text', 0)  == 'Please choose this number:') then 


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

Re:

Posted: 2019-11-03 04:45:54
by caH4o
Grin wrote:В принципе в полне конечный вариант, по тестить особо не удалось, так как чара дали серого;) киляют постоянно;) (запускать antimacro)

Code: Select all

      
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:

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