+ Ответить в теме
Показано с 1 по 3 из 3
  1. #1
    Аватар для Alan_wake Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Постоялец
    Сообщений
    946
    Поблагодарили 9 раз(а) в 9 сообщениях

    Отрисовка сетки Canvas со смещением

    Вот, решил сделать проект один с использованием Canvas, и решил рисовать сетку.
    Рисую сетку, и хочу сделать так, что-бы исходя из области ширины и высоты нашего объекта, в котором рисуется сетка, и исходя из её размеров в пикселах можно было её рисовать со смещением и без фанатизма. Т.е. рисовать только в той области, где увидит пользователь.


    Данный код рисует сетку относительно смещения, исходя из ширины / высоты и размера в пикселах
    PHP код:
    for($i 1$i <= $cv; ++$i)
               {
                   
    $ps $pos['v']['x1'] + ($i $gd);
                       
    $this->Move($ps0);
                       
    $this->Line($ps$h);

               }
               for(
    $i 1$i <= $ch; ++$i)
               {
                   
    $ps $pos['h']['y1'] + ($i $gd);
                       
    $this->Move(0$ps);
                       
    $this->Line($w$ps);
               } 
    Вот таким способом я вычисляю количество итераций для первого и второго цикла for, описанных выше
    PHP код:
     $vi round( ( $w $gd ) ,,);
            
    $hi round( ( $h $gd ) ,,); 
    И ломал я голову часа три над задачей, как же всё-таки грамотно вычислить смещение так, чтобы первая линия рисовалась тогда когда, X > 0 исходя из позиции(равносильно Y)
    К примеру, если по X у нас смещение X = -1; то первая линия будет рисоваться 19 пикселов слева и далее по циклу for до конца ширины объекта, таким же макаром для X = 1; То рисоваться будет от позиции X = 1;

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

    PHP код:
     if($dx 0)
            {
                do
                {
                    
    $ret['v']['x1'] = ( $vcs $gd ) + $dx;
                    
    $vcs++;
                }while( (
    $vcs $gd) + $dx );

            }elseif(
    $dx 0)
            {
                do
                {
                    
    $ret['v']['x1'] = ( $vcs $gd ) - $dx;
                    
    $vcs++;
                }while( (
    $vcs $gd) - $dx );
            }

            if(
    $dy 0)
            {
                do
                {
                    
    $ret['h']['y1'] = ( $hcs $gd ) + $dy;
                    
    $hcs++;
                }while( (
    $hcs $gd) + $dy );

            }elseif(
    $dy 0)
            {
                do
                {
                    
    $ret['h']['y1'] = ( $hcs $gd ) - $dy;
                    
    $hcs++;
                }while( (
    $hcs $gd) - $dy );
            } 
    Пожалуйста, найдите способ более компактный и быстрый (по таймингу)


    UPD: такое решение даже не совсем корректно работает
    Последний раз редактировалось Alan_wake; 14.07.2018 в 12:50.

  2. #2
    Аватар для NdSZ NdSZ Не известно кто Любопытный
    Сообщений
    32
    Поблагодарили 0 раз(а) в 0 сообщениях
    Тебе надо сначала узнать, сколько можно воткнуть в горизонтальное и вертикальное воткнуть квадратов. С учётом их ширины и высоты. И на создавать их, отрисовав

  3. #3
    Аватар для Alan_wake Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Постоялец
    Сообщений
    946
    Поблагодарили 9 раз(а) в 9 сообщениях
    Цитата Сообщение от NdSZ Посмотреть сообщение
    Тебе надо сначала узнать, сколько можно воткнуть в горизонтальное и вертикальное воткнуть квадратов. С учётом их ширины и высоты. И на создавать их, отрисовав
    На отрисовку одной линии уйдёт меньше времени, чем на один квадрат, а линий там ещё меньше, чем конкретно квадратов, да, ты по-сути прав, но я хочу сделать это дело всё с максимальной оптимизацией, с минимум затрат на лишнее.
    Твоё предложение всё-таки по-сути в теории может оказаться полезным, но тогда придётся отрисовывать квадраты за пределами экрана(как-бы немного заезжая) за него, но опять же - минимум затрат. Да и я просил публику покопаться в коде и найти решение задачки(так сказать головоломка), и скинуть свой пример решения.

Ваши права

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