Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Получить все точки отрезка прямой? (https://javascript.ru/forum/offtopic/52479-poluchit-vse-tochki-otrezka-pryamojj.html)

Gozar 26.12.2014 11:51

Цитата:

Сообщение от l-liava-l
Надеюсь я правильно понял вопрос

Не понимаю, что ты хотел сказать, но надеюсь ты понимаешь ;)

l-liava-l 26.12.2014 14:26

Цитата:

Не понимаю, что ты хотел сказать, но надеюсь ты понимаешь
Я ответил на твой вопрос. как найти все точки отрезка зная его кординаты. :)

Gozar 26.12.2014 15:04

Цитата:

Сообщение от l-liava-l
Я ответил на твой вопрос. как найти все точки отрезка зная его кординаты.

Садись, два! :)

l-liava-l 26.12.2014 16:20

Цитата:

Садись, два!
Может и 2) Обьясни тогда что ты хотел, для чего и как решил. Если можно конечно)

Gozar 26.12.2014 16:43

Цитата:

Сообщение от l-liava-l
Обьясни тогда что ты хотел

На второй странице аж 2 ответа:
http://javascript.ru/forum/offtopic/...tml#post347499

http://javascript.ru/forum/offtopic/...tml#post347501

melky 26.12.2014 18:28

Цитата:

Сообщение от l-liava-l
137px имеет 137 точек.

это если она строго горизонтальная\вертикальн я, верно ведь?

Malleys 26.12.2014 18:40

Цитата:

Сообщение от melky
верно ведь?

верно
http://learn.javascript.ru/play/iMCuR

Malleys 26.12.2014 18:44

Цитата:

Сообщение от melky
если она строго горизонтальная\вертикальн

необязательно. надо взять максимум x2-x1 и y2-y1

l-liava-l 26.12.2014 19:22

Цитата:

это если она строго горизонтальная\вертикальн �я, верно ведь?
Да, но погрешность так и так будет, мы даже работаем не с физическими пикселями а виртуальными.

Gozar 26.12.2014 20:34

Цитата:

Сообщение от melky
это если она строго горизонтальная\вертикальн , верно ведь?

Нет не верно. Число пикселей будет всегда равно большей разнице по x или y.

Экранная линия, это не одно и тоже, что линия в геометрии. В этом примере http://learn.javascript.ru/play/iMCuR применено сглаживание и на экране визуально может быть кажется и линией, но в действительности это линия и градиенты. Мне нужна только линия в данный момент, сглаживание линии типа lineTo поддерживается современным api, а мне нужно то, что не поддерживается.

nerv_ 26.12.2014 22:39

Цитата:

Сообщение от l-liava-l
Например прямая длиной 137px имеет 137 точек

Цитата:

Сообщение от melky
это если она строго горизонтальная\вертикальн �я, верно ведь?

Цитата:

Сообщение от Malleys
верно

Я возьму шнурок длинной метр. Положу его на пол, так, чтобы он был параллелен воображаемой оси X. Его длинна не измениться, верно?
Затем я возьму его же, но расположу перпендикулярно оси X. Метр останется метром.
Далее, я расположу его под углом 45 градусов к оси X. Вы хотите сказать, что метр перестанет быть метром?
:) Если да, рекомендую проделать вышеизложенное)))

upd прямая длинной 137 имеет длину 137

Выше я уже писал, что от зума зависит. Впрочем, это не совсем правильное утверждение)))
http://learn.javascript.ru/play/0P9hib

---

Что касается Гозара. Я не понял, чего ему надобно. Он говорит получил, что хотел... ну... молодец)))

JsLoveR 26.12.2014 22:55

Ребят, что вы ерундой занимаетесь) Гозару требовался алгоритм построения линии. Лучше бы рассуждали какой алгоритм самый оптимальный, честное слово;)

melky 26.12.2014 22:59

Цитата:

Сообщение от nerv_
Он говорит получил, что хотел... ну... молодец)))

теперь можно пофлудить)

Цитата:

Сообщение от nerv_
Затем я возьму его же, но расположу перпендикулярно оси X. Метр останется метром.

а пиксель - смажется. потому что лесенка сглаживается.

Aetae 26.12.2014 23:01

JsLoveR, самый оптимальный - юзануть WebGL и считать на GPU.:)

MallSerg 26.12.2014 23:08

Цитата:

Сообщение от Aetae
самый оптимальный - юзануть WebGL и считать на GPU.

далеко не всегда общение через uniform переменные не бесплатное и влечет за собой накладные расходы.
В общем профит должен быть заметно больше чем накладные расходы иначе нет смысла огород городить =).

Aetae 26.12.2014 23:17

Ещё можно координаты в typedArray хранить, тоже какая-никакая оптимизация.)

nerv_ 26.12.2014 23:21

Цитата:

Сообщение от JsLoveR
Ребят, что вы ерундой занимаетесь)

на ерунде форум держится :) Т.е. в споре рождается истина)

Цитата:

Сообщение от JsLoveR
Гозару требовался алгоритм построения линии. Лучше бы рассуждали какой алгоритм самый оптимальный, честное слово

см. ссылку в моем предыдущем посте. Куда быстрее?

Цитата:

Сообщение от melky
а пиксель - смажется. потому что лесенка сглаживается

длинна останется неизменной)

Gozar 26.12.2014 23:22

Цитата:

Сообщение от JsLoveR
Гозару требовался алгоритм построения линии

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

Цитата:

Сообщение от JsLoveR
Лучше бы рассуждали какой алгоритм самый оптимальный

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

Цитата:

Сообщение от Aetae
самый оптимальный - юзануть WebGL и считать на GPU

У меня тысяча линий разной длинны и угла наклона строится
В хроме за 1690 мс. //Это кстати довольно быстро
В лисе за 8425 мс. //что очень печалит

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

Gozar 26.12.2014 23:25

Цитата:

Сообщение от nerv_
см. ссылку в моем предыдущем посте. Куда быстрее?

Нерв, мне не нужно рисовать линию, вернее нужно, но не прямую, вернее прямую, но не линию. Короче:
Цитата:

Сообщение от Gozar
Мне нужны координаты всех точек которые образуют кратчайший отрезок между двух точек

А ты просто тупо рисуешь четырехугольник с размытием.

Чувствуешь разницу: четырехугольник с размытием и координаты всех пикселей, между двумя разными пикселями на экране образующие отрезок.

MallSerg 26.12.2014 23:25

публикуй конкретную реализацию конкретной задачи тут похоже будет интересно поковыряться выжимая миллисекунды

Aetae 26.12.2014 23:29

В лисе ещё asm.js можно попробовать юзануть.

Gozar 26.12.2014 23:30

Нужны координаты всех точек, образующие кротчайшую непрямую линию, где на каждые 4 пикселя приходиться активных только 2. (Алгоритм Брезенхема)

Цитата:

Сообщение от MallSerg
публикуй конкретную реализацию конкретной задачи тут похоже будет интересно поковыряться выжимая миллисекунды

Решение на 2 странице, уже постил дважды, надоело уже.

Gozar 26.12.2014 23:33

Цитата:

Сообщение от Aetae
В лисе ещё asm.js можно попробовать юзануть.

JS и так довольно быстрый на подсчет, а вот скорость отрисовки объектов на канвас я бы с удовольствием оптимизировал.

nerv_ 26.12.2014 23:41

Цитата:

Сообщение от Gozar
Нерв, мне не нужно рисовать линию, вернее нужно, но не прямую, вернее прямую, но не линию

:D

Цитата:

Сообщение от Gozar
Мне нужны координаты всех точек которые образуют кратчайший отрезок между двух точек

кратчайшее расстояние от одной точки до другой... :)

Цитата:

Сообщение от Gozar
А ты просто тупо рисуешь четырехугольник с размытием

я ничего не рисую :) Это ты у себя что-то рисуешь)))

Aetae 26.12.2014 23:45

Gozar, если нужно просчитать, а потом разом отрисовать, то при работе с imageData напрямую должно быть быстро.(посчитал - разом отрисовал). Если нужно постепенно - тоже не всё так однозначно: http://jsperf.com/setting-canvas-pixel (разные ревизии стоит тоже посмотреть) :)

Gozar 26.12.2014 23:54

Цитата:

Сообщение от Aetae
постепенно

Постепенно и зависит от множества свойств, формы отрисовывания объектов и различных коэффициентов. Не хотел перегружать тему.

Меня больше теперь интересует вопрос: как найти координаты всех точек между двух точек кривой Безье :D

Цитата:

Сообщение от nerv_
я ничего не рисую

Наверное это не ты дал ссылку http://learn.javascript.ru/play/0P9hib

melky 26.12.2014 23:59

Цитата:

Сообщение от Gozar
Меня больше теперь интересует вопрос: как найти координаты всех точек между двух точек кривой Безье

взять систему и варьировать t с шагом в пиксель:D

nerv_ 27.12.2014 00:03

Цитата:

Сообщение от Gozar
Меня больше теперь интересует вопрос: как найти координаты всех точек между двух точек кривой Безье

Я так сразу и подумал, что ты не тем занимаешься :) Гозар - хитрый лис :D

Ну, как бы есть график функции, где на интервалах эта самая функция ведет себя особым образом =) Т.е. тебе надо выделить интервалы и функции для этих интервалов (если рассматривать задачу в общем виде)

Gozar 27.12.2014 00:10

nerv_,
Нужен просто алгоритм построения Безье ;)

nerv_ 27.12.2014 00:20

Цитата:

Сообщение от Gozar
Нужен просто алгоритм построения Безье

только для тебя :)
http://learn.javascript.ru/bezier
http://www.w3schools.com/tags/canvas_beziercurveto.asp

Gozar 27.12.2014 00:30

Цитата:

Сообщение от nerv_
только для тебя

Цитата:

Сообщение от Gozar
алгоритм

алгоритм != математическая формула

https://ru.wikipedia.org/wiki/%D0%90...8C%D0%B6%D0%BE
https://code.google.com/p/polypuch/s...ier/bezier.cpp
чуешь разницу?

nerv_ 27.12.2014 01:28

Цитата:

Сообщение от Gozar
алгоритм != математическая формула

есть же функции контекста 2д

x^2 quadraticCurveTo()
x^3 bezierCurveTo()

http://learn.javascript.ru/play/pJdbfb

l-liava-l 27.12.2014 02:39

у кого то сегодня будет секс с производными...:)

JsLoveR 27.12.2014 11:43

Самый оптимальный алгоритм построения прямых линий если API не подходит:
1. Не использовать корней.
2. Не использовать операции деления и если возможно минимизировать умножения.
3. Использовать imageData как Aetae говорит, когда надо

Год назад писал рендер толстых полилиний, используя api-заливку и метод lineTo, чтобы получить замкнутую трапецию, мне удалось обогнать api-шный рендер.
Цитата:

Сообщение от Gozar
Меня больше теперь интересует вопрос: как найти координаты всех точек между двух точек кривой Безье

Дед Мороз безьешку 3-го порядка принес:
Поиграться можно тут http://learn.javascript.ru/play/qkbwbb

/* Кубическая кривая Безье */
      
      function bezierCurveTo(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {
		 /*
		   обычно хватает взять расстояние 2-х конечных точек для интерполяции кривой если точки соединяются отрезком,
		   если же кривая рисуется точками придется брать сумму расстояний всех точек. Но есть и аналитические решения с оптимизированным подходом
		 */	
		var dist = distance(p1x, p1y, p2x, p2y), 
			step = 1 / dist;
		 	_x = p1x, 
			_y = p1y;
		
		for ( var t = 0; t < 1; t += step ) {
			var a = (1-t) * (1-t) * (1-t),
				b = 3 * t * (1-t) * (1-t),
				c = 3 * t * t * (1-t),
				d = t * t * t,
				x = a * p1x + b * p2x + c * p3x + d * p4x,
				y = a * p1y + b * p2y + c * p3y + d * p4y;
			
            //здесь стоит использовать самую оптимальную фун-ю,
            //например, оптимизированный вариант Брезенхема
			drawLineTo(_x, _y, x, y, step);
			
			_x = x;
			_y = y;
		}
	  }

Gozar 27.12.2014 12:13

Цитата:

Сообщение от JsLoveR
Дед Мороз безьешку 3-го порядка принес:
Поиграться можно тут http://learn.javascript.ru/play/qkbwbb

Класс! Спасибо. :D

Цитата:

Сообщение от nerv_
есть же функции

Кэп? Прикинь я ими даже пользоваться умею, но это никаким местом не помогает решать поставленную задачу.
Не догоняешь? Допустим тебе нужно написать текст по кривой безье, например как тут: http://wiki.scribus.net/wiki/images/0/00/Textpath1.jpg как мне поможет функция, которая просто рисует кривую?

nerv_ 27.12.2014 15:44

Цитата:

Сообщение от Gozar
Кэп? Прикинь я ими даже пользоваться умею, но это никаким местом не помогает решать поставленную задачу.
Не догоняешь? Допустим тебе нужно написать текст по кривой безье, например как тут: http://wiki.scribus.net/wiki/images/0/00/Textpath1.jpg как мне поможет функция, которая просто рисует кривую?

конечно "не догоняю". Тут вообще никто не догоняет, что ты сделать хочешь, т.к. ты нам этого не говоришь. Аргументы вроде "мне нужна прямая, вернее не прямая, но нужна" мы уже слышали :)
Вместе с тем ты дико негодуешь, почему мы до сих пор тебя не поняли и не можем прочитать твои мысли.

svg
http://jsfiddle.net/chriswilsondc/4UykA/
http://www.kevlindev.com/tutorials/b.../svg/index.htm

canvas
https://developer.mozilla.org/en-US/...longPath.28.29

Gozar 27.12.2014 16:27

Цитата:

Сообщение от nerv_
ты дико негодуешь

Я пытаюсь понять нафиг ты пишешь в этой теме, если даже не пытаешься её понять?

Мне не нужно писать текст вдоль кривой, это был пример, который как мне тогда подумалось поможет именно тебе понять зачем это нужно, но похоже не получилось. Я не ем суп вилкой, но ты почему-то так считаешь. Давай по другому: нужно написать слово вдоль кривой, но так чтобы одна буква была сверху, а другая снизу, а третья смотрела в другую сторону.

Цитата:

Сообщение от nerv_
вообще никто не догоняет

JsLoveR, прекрасно понял, что нужно. ;)

nerv_ 28.12.2014 00:07

Цитата:

Сообщение от Gozar
Я пытаюсь понять нафиг ты пишешь в этой теме, если даже не пытаешься её понять?

какой вопрос, такой ответ. Постараюсь больше не писать в твоих темах :) ......... в этом году :D

Gozar 28.12.2014 11:00

Цитата:

Сообщение от nerv_
Постараюсь больше не писать в твоих темах

Лучше постарайся сначала понять вопрос. ;)

melky 28.12.2014 14:07

Цитата:

Сообщение от l-liava-l (Сообщение 348515)
у кого то сегодня будет секс с производными...:)

я в своё время трахался с wolfram alpha для производных\первообразных для полиномов третьей степени (кубич. кривые Безье))
вручную это делать - ад


Часовой пояс GMT +3, время: 20:26.