Здравствуйте народ! Помогите плиз! Что-то ничего толком неполучается с выводом такой формулы(если Вы знаете алгоритм ,тоже очень неплохо,может ссылочку подкинете,пишу в С++):
1. есть экранные коорд-ы (нач. коорд. находится в верхнем левом углу)
2. есть некий набор точек,расположенных в виде сетки, шаг которой S пикс. на экране
3. преобразование из системы коорд. сетки в экранную плоск-ть такое:
Xscreen=Xсетки*S/100
4. нулевая координата у сетки находится в (X0screen;Y0screen),т.е. видимо
X0screen=X0сетки*S/100 //(следует из преобразования)
,в проге изначально дана только X0сетки
Вопрос: вычислить коорд. той точки сетки(Xсетки, ответ нужен в системе коорд. сетки), которая ближе всего к точке Xscreen(коорд-та на экране).
Т.о. исходные данные — это X0сетки ,Xscreen и S.
Здравствуйте 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, если с целыми не можешь совладать...
E>ММММ.... Мычу... Ты случайно не систему вывода окон пишешь...
нее ,типа редактор векторный(что-то похожее),там приходится по многу раз выполнять это преобразование сетка->экран,экран->сетка,глюк сидит где-то в "экран->сетка"...
E>Обычное округление... Вот и всё... E>Так что придёться перейти на Float, если с целыми не можешь совладать... E>Edmond
E>Xscreen=Xсетки*S/100
большое спасибо за совет,просто я думал,может в самой идее содержится подвох
и еще маленький нюансный вопросик: округление достаточно применять ко всей формуле или по-отдельности к каждому слагаемуму или еще как?Xсетки=Xscreen*100/S+X0сетки (конечная картина получается местами сдвинутая на 1пикс.)
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
Нарисуй на бумажке
Здравствуйте 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>Заранее спасибо всем!
Здравствуйте 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"и обратно...
//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); // переход в оконные координаты
Здравствуйте Аноним, Вы писали:
А>Первое что на ум пришло... А>Теорема Пифагора... А>Ближайшая точка это наименьшее расстояние ... А>Это наименьшее расстояние это гипотенуза прямоугольного треугольника А>построенного на катетах, где катеты — разности X — вых и Y — вых координат точки Xscreen и точки из массива точек, среди которых надо найти ближайшую...
А>Таким образом надо перебрать все точки среди которых надо найти ближайшую и найти минимальную гипотенузу... А>Как то так... А>P.s А>Нарисуй на бумажке