User Tag List

Страница 85 из 113 ПерваяПервая ... 818283848586878889 ... ПоследняяПоследняя
Показано с 841 по 850 из 1128

Тема: ЭТЮДЫ

  1. #841

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    не помню как правильно not P
    JP M,...

    Цитата Сообщение от blackmirror Посмотреть сообщение
    нужно три ветки
    Вроде как ещё больше переходов стало

    Спасибо, ребят, ща буду пробовать...

  2. #841
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #842

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Destr Посмотреть сообщение
    Вроде как ещё больше переходов стало
    Изначально было 2 перехода в отрицательной ветви и 3 перехода в положительной, здесь 1 или 2 перехода и нет пересылки, если JP Z выполняется после фиксированного числа итераций, то его можно вообще убрать. Вообще неплохо бы пояснить что это за код, потому что сейчас это что-то типа (A+B)/2 для старшей части и (A+B)/2^(128&(A^B)) для младшей, может здесь тоже что-то можно сократить.

    Этот пользователь поблагодарил blackmirror за это полезное сообщение:

    Reobne(02.10.2019)

  4. #843

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    1,336
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Вообще неплохо бы пояснить что это за код
    Именно.
    И если среднее считается, то границы сойдутся скорее всего не в нуле, Z не случится, и цикл будет бесконечным.

  5. #844

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Вообще неплохо бы пояснить что это за код
    8-ми битное клиппирование по 0 для Y2
    In:
    DE=Y1X1 (заведомо находится в "видимой части" (D>0)
    HL=Y2X2 (Y2 - заведомо находится за границей (H<0, L может быть как >0 так и <0)
    Out:
    DE - без изменений
    HL - новые координаты (H=0, L - высчитывается этой самой попдрограммкой)

    (решение о клиппировании/или не надо принимается ранее (по знаку H), это частный случай, остальные стороны клиппируются так-же)
    Нарисовал-бы рисунок, но не знаю как вставлять сюда картинки (без танцев с бубном, хорошо-бы чтоб у нас как в ВК можно было, копи-пастом)
    Но думаю и так понятно, "видимое" поле - это всё что попадает в положительный квадрант, остальное уже рассматривается и отсекается по нужной стороне.

    Собственно потому и рассчитываются немного по разному средняя точка для X ил для Y - ибо у X учитывается полярность, а для Y она уже известно (D+,H-)

    Цитата Сообщение от Reobne Посмотреть сообщение
    И если среднее считается, то границы сойдутся скорее всего не в нуле, Z не случится, и цикл будет бесконечным.
    Всё сходится, бро, не забывай что координаты каждый раз новые, отрезок делится постоянно и в зависимости от того куда упало среднее (в + или -) - меняются точки расчёта, в конце-концов средняя оказывается в нуле (по Y) что и требуется.
    Последний раз редактировалось Destr; 02.10.2019 в 12:38.

    Эти 2 пользователя(ей) поблагодарили Destr за это полезное сообщение:

    blackmirror(02.10.2019), Reobne(02.10.2019)

  6. #845

    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Проверка на 0 понятна, а зачем проверяется чётность?

  7. #846

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Проверка на 0 понятна, а зачем проверяется чётность?
    Чётность?
    Если ты про JP P, то путаешь видимо с JP PO(PE)
    JP P,n - это переход если результат ПОЛОЖИТЕЛЬНЫЙ (PLUS)
    Антипод - JP M,n (MINUS). Это флаг знака S (SIGNUM что-ли)
    А флаг переполнения/чётности V/P, да, но в мнемониках путаница (только С и Z флаги "правильно" пишутся в мнемониках, C/NC-Z/NZ, а в остальном бардак)

    Вообще косяков в мнемониках полно, тот-же ADD A,n (по идее ему быть ADD n ибо только к аккумулятору и применим, вот SUB n - "правильное")
    Последний раз редактировалось Destr; 02.10.2019 в 14:04.

  8. #847

    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отблин, как же тяжело на 10 языках сразу думать и становится всё сложнее. Старею, что ли...

    Ещё предложение. Считать не BC=f(DE,HL), а HL=f(BC,DE), и в одной из веток "LD DE,BC" заменить на "EX DE,HL".

    И ещё:
    Код:
       add HL,BC
       sra H
       rr L
    не то же самое? Не совсем понял общий алгоритм, но примерно так:
    Код:
    	PUSH DE
    	JP PMID
    PMID_2
    	RR L
    PMID
    	LD BC,HL
    	ADD HL,DE
    	SRA H
    	JP M,PMID_2
    	JR Z,BZER ; jr быстрее jp, если переход не выполняется
    BPOS
    	RR L
    	LD DE,HL
    	ADD HL,BC
    	SRA H
    	JP M,PMID_2
    	JP NZ,BPOS
    BZER
    	POP DE
    	RET
    Последний раз редактировалось Bolt; 02.10.2019 в 16:59.

  9. #848

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Destr, насколько длинные отрезки попадают на вход алгоритма? Если вычислять x=x1+dx или y=y1+dy, то dx или dy можно считать за 8 развернутых итераций как выражение A*B/C, где все числа беззнаковые и B<=C. Если A<=127 - в одной итерации будут 2 сложения с аккумулятором, условный переход и сдвиг для установки бита результата. Или можно использовать регистровые пары, если требуется A до 255, хотя цикл немного замедлится. Примерно по 30-35 команд в положительной и отрицательной ветке, и еще некоторое количество команд в ветке инициализации в которой B и C умножаются на 2, пока С<128, при этом такое же количество шагов будет пропущено в основных ветках. Или сотня команд слишком большая цена для оптимизации этого цикла?
    Последний раз редактировалось blackmirror; 02.10.2019 в 21:17.

  10. #849

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    щё предложение. Считать не BC=f(DE,HL), а HL=f(BC,DE), и в одной из веток "LD DE,BC" заменить на "EX DE,HL".
    Про это думал, но оставил на потом, как явный вариант который будет применён когда уже остальное всё будет развёрнуто и избавлено от лишнего

    Цитата Сообщение от Bolt Посмотреть сообщение
    Не совсем понял общий алгоритм
    Алгоритм простой:
    0. В DE коорд.начала отрезка YnXn, в HL коорд. конца YkXk (известно что H<0)
    1. Находится средняя точка отрезка (середина) Xm=(Xn+Xk)/2: Ym=(Yn+Yk)/2
    2. Если Ym равен нулю - то это конец отрезка (YkXk=YmXm), клиппирование выполнено, RET
    3. Если Ym<0 то XmYm - это новые координаты конца (YkXk=YmXm)
    4. Если Ym>0 то XmYm - это новые координаты начала (YnXn=YmXm)
    5. Goto 1

    Цитата Сообщение от blackmirror Посмотреть сообщение
    насколько длинные отрезки попадают на вход алгоритма
    -128...127
    Получается максимум: DE=#7f7f, HL=#8080, это длина отрезка= SQR(255^2 + 255^2)=360

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Или сотня команд слишком большая цена для оптимизации этого цикла?
    Да небольшая, но пока не понял что ты предлагаешь.
    Последний раз редактировалось Destr; 03.10.2019 в 08:14.

  11. #850

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Destr Посмотреть сообщение
    Да небольшая, но пока не понял что ты предлагаешь.
    Если есть две точки (X1,Y1) и (X2,Y2) через которые проходит некоторая прямая, то узнать значение X для заданного Y чтобы точка оказалась на прямой можно по формуле:
    X=X1+(Y-Y1)/(Y2-Y1)*(X2-X1), то есть фактически задача сводится к вычислению D=A*B/C. Далее некоторые рассуждения на тему того, как эти операции можно выполнить вместе без увеличения разрядности, но пока у алгоритма есть существенные ограничения по диапазону корректно обрабатываемых величин.

    В развёрнутом алгоритме деления используется остаток S, который сдвигается с добавлением по 1 биту из A, если S<0, то к нему добавляется С, иначе вычитается, после чего частное сдвигается и к нему добавляется 1 если S>=0.
    Для алгоритма умножения можно сдвигать B и если в перенос попадает 1, то добавлять к произведению A (здесь требуется увеличение разрядности).
    Если объединить добавление A и С(или вычитание) из этих двух алгоритмов, то получается 4(на счёт 2х я ошибся) параллельные ветки по 8 итераций:
    S<0, B>=128, нужно добавлять A+C
    S<0, B<128, нужно добавлять С
    S>=0, B<128, нужно добавлять -С
    S>=0, B>=128, нужно добавлять A-C
    Одна итерация в каждой ветке выглядит так:
    сдвигаем B и затягиваем в него перенос полученный после сложения в качестве бита частного
    если требуется, делаем переход в другую ветку
    удваиваем сумму(из-за этого шага алгоритм деления не может работать с числами более 2^7, а использование A+C в суммировании уменьшает их диапазон вдвое)
    добавляем константу соответствующую данной ветке
    делаем переход в другую ветку, если знак суммы поменялся

    Не факт что это будет особенно полезно применительно к отрезкам, но может у кого-то появятся другие идеи где это можно использовать.

Страница 85 из 113 ПерваяПервая ... 818283848586878889 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •