вопрос по коорд.
От: piAnd Россия  
Дата: 10.07.02 15:54
Оценка:
Здравствуйте народ! Помогите плиз! Что-то ничего толком неполучается с выводом такой формулы(если Вы знаете алгоритм ,тоже очень неплохо,может ссылочку подкинете,пишу в С++):

1. есть экранные коорд-ы (нач. коорд. находится в верхнем левом углу)

2. есть некий набор точек,расположенных в виде сетки, шаг которой S пикс. на экране

3. преобразование из системы коорд. сетки в экранную плоск-ть такое:
Xscreen=Xсетки*S/100



4. нулевая координата у сетки находится в (X0screen;Y0screen),т.е. видимо
X0screen=X0сетки*S/100 //(следует из преобразования)

,в проге изначально дана только X0сетки

Вопрос: вычислить коорд. той точки сетки(Xсетки, ответ нужен в системе коорд. сетки), которая ближе всего к точке Xscreen(коорд-та на экране).
Т.о. исходные данные — это X0сетки ,Xscreen и S.

---------------------
Заранее спасибо всем!
Re: вопрос по коорд.
От: Edmond  
Дата: 10.07.02 16:00
Оценка:
Здравствуйте piAnd, Вы писали:

A>Здравствуйте народ! Помогите плиз! Что-то ничего толком неполучается с выводом такой формулы(если Вы знаете алгоритм ,тоже очень неплохо,может ссылочку подкинете,пишу в С++):


A>1. есть экранные коорд-ы (нач. коорд. находится в верхнем левом углу)


A>2. есть некий набор точек,расположенных в виде сетки, шаг которой S пикс. на экране


A>3. преобразование из системы коорд. сетки в экранную плоск-ть такое:

A>
A>Xscreen=Xсетки*S/100
A>



A>4. нулевая координата у сетки находится в (X0screen;Y0screen),т.е. видимо

A>
A>X0screen=X0сетки*S/100 //(следует из преобразования) 
A>

A>,в проге изначально дана только X0сетки

A>Вопрос: вычислить коорд. той точки сетки(Xсетки, ответ нужен в системе коорд. сетки), которая ближе всего к точке Xscreen(коорд-та на экране).

A>Т.о. исходные данные — это X0сетки ,Xscreen и S.

A>---------------------

A>Заранее спасибо всем!

ММММ.... Мычу... Ты случайно не систему вывода окон пишешь...

Обычное округление... Вот и всё...

Так что придёться перейти на Float, если с целыми не можешь совладать...

Edmond

Xscreen=Xсетки*S/100
С уважением, Edmond
Re[2]: вопрос по коорд.
От: piAnd Россия  
Дата: 10.07.02 16:52
Оценка:
Здравствуйте Edmond, Вы писали:


E>ММММ.... Мычу... Ты случайно не систему вывода окон пишешь...

нее ,типа редактор векторный(что-то похожее),там приходится по многу раз выполнять это преобразование сетка->экран,экран->сетка,глюк сидит где-то в "экран->сетка"...


E>Обычное округление... Вот и всё...
E>Так что придёться перейти на Float, если с целыми не можешь совладать...
E>Edmond

E>Xscreen=Xсетки*S/100

большое спасибо за совет,просто я думал,может в самой идее содержится подвох
и еще маленький нюансный вопросик: округление достаточно применять ко всей формуле или по-отдельности к каждому слагаемуму или еще как?Xсетки=Xscreen*100/S+X0сетки (конечная картина получается местами сдвинутая на 1пикс.)
Re[3]: вопрос по коорд.
От: fAX Израиль  
Дата: 11.07.02 03:08
Оценка:
Здравствуйте piAnd, Вы писали:



A>

E>>ММММ.... Мычу... Ты случайно не систему вывода окон пишешь...

A>нее ,типа редактор векторный(что-то похожее),там приходится по многу раз выполнять это преобразование сетка->экран,экран->сетка,глюк сидит где-то в "экран->сетка"...

Не надо float, лучше храни в целых при такой-то формуле. А когда на экран выводишь — тогда и округляй... Чтоб без деления, тогда x' = (x+50) div 100. Назад — x = x' * 100. Но тогда точность теряется. А зачем много раз "туда-сюда"?!!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re: вопрос по коорд.
От: Аноним  
Дата: 11.07.02 05:41
Оценка:
Здравствуйте piAnd, Вы писали:

A>Здравствуйте народ! Помогите плиз! Что-то ничего толком неполучается с выводом такой формулы(если Вы знаете алгоритм ,тоже очень неплохо,может ссылочку подкинете,пишу в С++):


A>1. есть экранные коорд-ы (нач. коорд. находится в верхнем левом углу)


A>2. есть некий набор точек,расположенных в виде сетки, шаг которой S пикс. на экране


A>3. преобразование из системы коорд. сетки в экранную плоск-ть такое:

A>
A>Xscreen=Xсетки*S/100
A>



A>4. нулевая координата у сетки находится в (X0screen;Y0screen),т.е. видимо

A>
A>X0screen=X0сетки*S/100 //(следует из преобразования) 
A>

A>,в проге изначально дана только X0сетки

A>Вопрос: вычислить коорд. той точки сетки(Xсетки, ответ нужен в системе коорд. сетки), которая ближе всего к точке Xscreen(коорд-та на экране).

A>Т.о. исходные данные — это X0сетки ,Xscreen и S.

A>---------------------

A>Заранее спасибо всем!
Первое что на ум пришло...
Теорема Пифагора...
Ближайшая точка это наименьшее расстояние ... :)
Это наименьшее расстояние это гипотенуза прямоугольного треугольника
построенного на катетах, где катеты — разности X — вых и Y — вых координат точки Xscreen и точки из массива точек, среди которых надо найти ближайшую...

Таким образом надо перебрать все точки среди которых надо найти ближайшую и найти минимальную гипотенузу...
Как то так... :)
P.s
Нарисуй на бумажке
Re: вопрос по коорд.
От: Edmond  
Дата: 11.07.02 06:36
Оценка: 1 (1)
Здравствуйте piAnd, Вы писали:

A>Здравствуйте народ! Помогите плиз! Что-то ничего толком неполучается с выводом такой формулы(если Вы знаете алгоритм ,тоже очень неплохо,может ссылочку подкинете,пишу в С++):


A>1. есть экранные коорд-ы (нач. коорд. находится в верхнем левом углу)


A>2. есть некий набор точек,расположенных в виде сетки, шаг которой S пикс. на экране


A>3. преобразование из системы коорд. сетки в экранную плоск-ть такое:

A>
A>Xscreen=Xсетки*S/100
A>


А можно поподробнее... Что от куда взялось...

Если я имею сетку с шагом S пикселей, то тогда к чему 100?

A>4. нулевая координата у сетки находится в (X0screen;Y0screen),т.е. видимо

A>
A>X0screen=X0сетки*S/100 //(следует из преобразования) 
A>

A>,в проге изначально дана только X0сетки

A>Вопрос: вычислить коорд. той точки сетки(Xсетки, ответ нужен в системе коорд. сетки), которая ближе всего к точке Xscreen(коорд-та на экране).

A>Т.о. исходные данные — это X0сетки ,Xscreen и S.

A>---------------------

A>Заранее спасибо всем!
С уважением, Edmond
Re[4]: вопрос по коорд.
От: piAnd Россия  
Дата: 11.07.02 11:47
Оценка:
Здравствуйте fAX, Вы писали:

fAX>Не надо float, лучше храни в целых при такой-то формуле. А когда на экран выводишь — тогда и округляй... Чтоб без деления, тогда x' = (x+50) div 100. Назад — x = x' * 100. Но тогда точность теряется.


с флоатом все работает ,местами сточностью +-1пикс.
x' = (x+50) div 100,точность в окне — это пиксел

fAX>А зачем много раз "туда-сюда"?!!


есть 3 окна с разными системами коорд. (вобщем 3D в 3-х разных проекциях),
чтобы во всех нарисовать соответствующие проекции,постоянно перевожу в общие 3D коорд.,а потом в экранные для кажд. окна. Если я,например, мышкой хочу добавить что-то типа стенки(из 2-х полигончиков),то мне надо во-первых,чтоб она была видна во всех окнах,второе — всего одим движением мыши добавив стенку, все её 6 вершин надо как-то вычислить через нач. и конечн. положения мыши,вобщем набегает куча "экран->3D"и обратно...
Re[2]: вопрос по коорд.
От: piAnd Россия  
Дата: 11.07.02 12:07
Оценка:
Здравствуйте Edmond, Вы писали:

E>


вобщем в таком виде работает

//x0 -нач.коорд. у сетки,относит. нач. у экрана(в родных коорд-ах сетки)
//S-шаг сетки в окне(пикс.)
//x -экранная точка(мышь)
// Round -округление по правилам математ.

float spx=x0[0]*S[0]/100.0; // так находим ближнюю к
float xx=100*(Round (x+spx)/S[0]); // x точку сетки

float spx=x0[0]*S[0]/100.0; // так просто переходим в систему коорд. 
float xx=100*(x+spx)/S[0]; // сетки,без привязки к точкам сетки

//x - некая коорд. у сетки
int xw=Round ((x-x0[0])*S[0]/100.0); // переход в оконные координаты
Re[2]: вопрос по коорд.
От: piAnd Россия  
Дата: 11.07.02 16:10
Оценка:
Здравствуйте Аноним, Вы писали:

А>Первое что на ум пришло...

А>Теорема Пифагора...
А>Ближайшая точка это наименьшее расстояние ...
А>Это наименьшее расстояние это гипотенуза прямоугольного треугольника
А>построенного на катетах, где катеты — разности X — вых и Y — вых координат точки Xscreen и точки из массива точек, среди которых надо найти ближайшую...

А>Таким образом надо перебрать все точки среди которых надо найти ближайшую и найти минимальную гипотенузу...

А>Как то так...
А>P.s
А>Нарисуй на бумажке

а точек у сетки практически 65536^2
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.