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. Хранить инфу в файлах - оттуда вытаскивать её ещё сложнее и дольше.
Я бы выбрал второй вариант, чтобы особо не вешать инжу захлаямлением памяти, впринципе - вариант вполне реальный, могу написать скриптик - будите сидеть нон-стоп цифры вводить, пока все не поперевводите (вариантов будет достаточно много)
А главное - решение будет коротким..
PS: Афинные преобразования заработали - синусы и косинусы местами перепутал, и ваще, не сразу понял, что это канонический алгоритм и на нуль мона намана поделить..
Вобщем вот, доразберусь с афинами, поеду в китай
Моё решение, которое я хочу реализовать, предполагает, что на скриптах инжы, оно будет решаться не более 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 тоже будет доли секунды работать, фишка с арктангенсом и квадратным корнем

Posted: 2007-05-04 10:10:00
by Grin
Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.
Posted: 2007-05-04 10:11:30
by Destruction
Grin wrote:Ну так ты дойди до работающего алгоритма.
Потом прикрути яву к инжекту.
Ява и яваскрипт штука разная, яву я пока не изучил
А насчёт работающих алгоритмов я уже приступил к осмысливанию того, что ты написал
PS: Харэ редактить свои посты

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 = |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
очистил
привет Грин
удачи Дестр

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
ПС дальше ерунда осталась

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
Destruction wrote:Осталось стереть пост и продавать

И не надейся

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
Удивительно если он вообще работал... или это специальная ошибка из разряда защиты от любителей скопировать\вставить не разбираясь в макросе

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