Форум программистов, компьютерный форум, киберфорум
JavaScript: HTML5 Canvas
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 1
Регистрация: 31.03.2012
Сообщений: 49
1

Работа с html5 canvas посредством JS

01.12.2012, 22:42. Показов 1343. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
интересует такая вещь, как можно проверить не пересекаются ли фигуры в canvase. С помощью JS создаю 2 фигуры и надо сделать проверку условия, если он пересекаются то пересоздать 2 фигуру. Как это можно реализовать без помощи сторонних фремворком.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2012, 22:42
Ответы с готовыми решениями:

Работа с html5, элемент canvas, заливка происходит только со второго onclick'a
Не могу сам разобраться в где ошибка. Элемент в canvas меняет цвет только со второго нажатия на...

Canvas html5, как разместить черный пискель в центре canvas'a?
как разместить черный пискель в центре canvas'a?

Видео на сайте посредством html5
Добрый день! Скажите пожалуйста, вставлять в тег <video> можно ссылки на видео с ютуба ? Сделал...

HTML5 (canvas)
Рисую на canvas такое изображение. Как можно сделать, чтобы пр нажатии на прямоугольник открывалось...

3
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112
03.12.2012, 17:47 2
Есть ряд способов.
Первый это просто хранить массив пикселей этих объектов( imageData ) и сравнивать их постоянно придвижении определяя их совпадение. Сравнение проводить по 4-ому значению пикселя которое хранит значение альфа канала( чтобы проверять только столкновение непрозрачных участков объекта ).

Усложнив можно хранить только пиксели поверхностей объектов - это значительно уменьшит вычисления.

Так же можно использовать webworkers чтобы распаралелить процесс вычислений.

Если будет надо могу кинуть пару примеров кода если найду свои старые
1
1 / 1 / 1
Регистрация: 31.03.2012
Сообщений: 49
03.12.2012, 23:06  [ТС] 3
буду благодарен, если найдете
0
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112
04.12.2012, 10:25 4
Непомню где нашел интересный алгоримт и адаптировал под себя.
Тут я уже готовым модулем сделал для своей либы.
Только замените пространсво имен на своё:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
 * 
 * Collision detect module
 * @param object Object which will be detect collision
 * @param other Second object with whitch will be detect eht collision
 * @return bool TRUE || FALSE
 * 
 */
SmartJ.ObjectsCollision = (function(objects){
  
  "use strict";
  
  /**
   * Objects interface
   * x - Object X position in px
   * y - Object Y position in px
   * width  Object width in px
   * height Object height in px
   * data Object ImageData
   */
  var Interface = [ "x", "y", "width", "height", "data" ];
 
  //Interface validation
  for( var i = 0; i < Interface.length; i++ ){
    for( var j in objects ){
      for( var p in objects[j] ){
        if( objects[j][Interface[i]] === undefined ){
          console.log("Incorrect parameters"); return false;
        };
      };
    };
  };
  
 
  //Method for pixel detection
  this.PixelDetection = function(first, x, y, other, x2, y2, isCentred){
    x  = Math.round( x );
    y  = Math.round( y );
    x2 = Math.round( x2 );
    y2 = Math.round( y2 );
 
    var w  = first.width,
        h  = first.height,
        w2 = other.width,
        h2 = other.height;
 
    if ( isCentred ) {
        x  -= ( w/2 + 0.5) << 0
        y  -= ( h/2 + 0.5) << 0
        x2 -= (w2/2 + 0.5) << 0
        y2 -= (h2/2 + 0.5) << 0
    };
 
    var xMin = Math.max( x, x2 ),
        yMin = Math.max( y, y2 ),
        xMax = Math.min( x+w, x2+w2 ),
        yMax = Math.min( y+h, y2+h2 );
 
    if( xMin >= xMax || yMin >= yMax ){
        return false;
    };
 
    var xDiff = xMax - xMin,
        yDiff = yMax - yMin,
        pixels  = first.data,
        pixels2 = other.data;
 
    if ( xDiff < 4 && yDiff < 4 ) {
        for ( var pixelX = xMin; pixelX < xMax; pixelX++ ) {
            for ( var pixelY = yMin; pixelY < yMax; pixelY++ ) {
                if(
                    ( pixels [ ((pixelX-x ) + (pixelY-y )*w )*4 + 3 ] !== 0 ) &&
                    ( pixels2[ ((pixelX-x2) + (pixelY-y2)*w2)*4 + 3 ] !== 0 )
                ){
                    return true;
                };
            };
        };
    }else{
        var incX = xDiff / 3.0,
            incY = yDiff / 3.0;
        incX = (~~incX === incX) ? incX : (incX+1 | 0);
        incY = (~~incY === incY) ? incY : (incY+1 | 0);
 
        for ( var offsetY = 0; offsetY < incY; offsetY++ ) {
            for ( var offsetX = 0; offsetX < incX; offsetX++ ) {
                for ( var pixelY = yMin+offsetY; pixelY < yMax; pixelY += incY ) {
                    for ( var pixelX = xMin+offsetX; pixelX < xMax; pixelX += incX ) {
                        if (
                                ( pixels [ ((pixelX-x ) + (pixelY-y )*w )*4 + 3 ] !== 0 ) &&
                                ( pixels2[ ((pixelX-x2) + (pixelY-y2)*w2)*4 + 3 ] !== 0 )
                        ) {
                            return true;
                        };
                    };
                };
            };
        };
    };
    return false;
  };
 
  
  //First all objects will be looks like a rectangles for simple detection
  var o1 = objects.element, 
      o2 = objects.toObject;
  if( 
    o1.x + o1.width >= o2.x &&
      o1.x < o2.x + o2.width &&
        o1.y + o1.height > o2.y &&
          o1.y < o2.y + o2.height
  ){
    return this.PixelDetection(o1.data, o1.x, o1.y, o2.data, o2.x, o2.y);
  };
  
  return false;
});
0
04.12.2012, 10:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2012, 10:25
Помогаю со студенческими работами здесь

HTML5 Canvas Диограмма
пытаюсь нарисовать диаграмму. Нарисовать круг и залить цветом получается но вот как отделить сектор...

Игры на JavaScript HTML5 и Canvas
Скажите пожалуйста, эта игра http://onlineguru.ru/25321/view.html написана на JavaScript HTML5 и...

Нарисовать кольцо с помощью canvas HTML5
Как нарисовать с помощью html5 подобие кольца? Добавлено через 12 минут Поднимаю тему

Написание текста используя canvas HTML5
необходимо Написать две буквы &quot;VA&quot;, но без помощи filltext есть у кого какие идеи?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru