캔버스에 드래그 가능한 여러 원 만들기

B. 프레 다

HTML 캔버스에서 여러 원을 드래그 할 수있게 만드는 데 문제가 있습니다. 나는 내가 뭘 잘못하고 있는지 정말 모른다. 누군가가 내 실수를 지적 할 수 있기를 바랍니다 (여기에서 신인이므로 너무 세게 두드리지 마세요)

여기에 내 코드를 첨부했습니다.

var canvas = document.getElementById("canvas");
  var ctx = canvas.getContext("2d");

  var c=document.getElementById("canvas");
  var ctx=c.getContext("2d");
  var cw=canvas.width;
  var ch=canvas.height;
  var dragok = false;
  var startX;
  var startY;



var circles=[];
circles.push({x:150,y:100,radius:20});
circles.push({x:200,y:20,radius:10});
circles.push({x:290,y:120,radius:30});
circles.push({x:180,y:300,radius:15});
circles.push({x:80,y:220,radius:40});


drawAll();

canvas.onmousedown = myDown;
canvas.onmouseup = myUp;
canvas.onmousemove = myMove;

function drawAll(){
  for(var i=0;i<circles.length;i++){
    drawCircle(circles[i]);
  }
}

function drawCircle(circle){
  var tempR;
  var tempB;
  var tempG;
  ctx.beginPath();
  ctx.arc(circle.x,circle.y,circle.radius,0,2*Math.PI);
  ctx.closePath();
  tempR = Math.floor(Math.random()*255);
  tempG = Math.floor(Math.random()*255);
  tempB = Math.floor(Math.random()*255);
  tempColor = "rgb(" + tempR + "," + tempG + "," + tempB +")";
  ctx.fillStyle = tempColor;
  ctx.fill();
}

function clear() {
    ctx.clearRect(0, 0, cw, ch);
}

// handle mousedown events
function myDown(e) {

    // tell the browser we're handling this mouse event
    e.preventDefault();
    e.stopPropagation();

    // get the current mouse position
    var mx = parseInt(e.clientX - offsetX);
    var my = parseInt(e.clientY - offsetY);

    // test to see if mouse is inside the circle
    dragok = false;
    for (var i = 0; i < circles.length; i++) {
        var r = circles[i];
        if (dx * dx && dy * dy < circles[i].radius * circles[i].radius) {
            // if yes, set that circles isDragging=true
            dragok = true;
            r.isDragging = true;
        }
    }
    // save the current mouse position
    startX = mx;
    startY = my;
}


// handle mouseup events
function myUp(e) {
    // tell the browser we're handling this mouse event
    e.preventDefault();
    e.stopPropagation();

    // clear all the dragging flags
    dragok = false;
    for (var i = 0; i < circles.length; i++) {
        circles[i].isDragging = false;
    }
}


// handle mouse moves
function myMove(e) {
    // if we're dragging anything...
    if (dragok) {

        // tell the browser we're handling this mouse event
        e.preventDefault();
        e.stopPropagation();

        // get the current mouse position
        var mx = parseInt(e.clientX - offsetX);
        var my = parseInt(e.clientY - offsetY);

        // calculate the distance the mouse has moved
        // since the last mousemove
        var dx = mx - startX;
        var dy = my - startY;

        // move each circle that isDragging
        // by the distance the mouse has moved
        // since the last mousemove
        for (var i = 0; i < circles.length; i++) {
            var r = circles[i];
            if (r.isDragging) {
                r.x += dx;
                r.y += dy;
            }
        }

        // redraw the scene with the new circle positions
        drawAll();

        // reset the starting mouse position for the next mousemove
        startX = mx;
        startY = my;

    }
}
PalinDrome555

이것은 찾고있는 것일 수 있습니다.

//track mouse position on mousemove
var mousePosition;
//track state of mousedown and up
var isMouseDown;

//reference to the canvas element
var c = document.getElementById("myCanvas");
//reference to 2d context
var ctx = c.getContext("2d");

//add listeners
document.addEventListener('mousemove', move, false);
document.addEventListener('mousedown', setDraggable, false);
document.addEventListener('mouseup', setDraggable, false);

//make some circles
var c1 = new Circle(50, 50, 50, "red", "black");
var c2 = new Circle(200, 50, 50, "green", "black");
var c3 = new Circle(350, 50, 50, "blue", "black");
//make a collection of circles
var circles = [c1, c2, c3];

//main draw method
function draw() {
    //clear canvas
    ctx.clearRect(0, 0, c.width, c.height);
    drawCircles();
}

//draw circles
function drawCircles() {
    for (var i = circles.length - 1; i >= 0; i--) {
        circles[i].draw();
    }
}

//key track of circle focus and focused index
var focused = {
   key: 0,
   state: false
}

//circle Object
function Circle(x, y, r, fill, stroke) {
    this.startingAngle = 0;
    this.endAngle = 2 * Math.PI;
    this.x = x;
    this.y = y;
    this.r = r;

    this.fill = fill;
    this.stroke = stroke;

    this.draw = function () {
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.r, this.startingAngle, this.endAngle);
        ctx.fillStyle = this.fill;
        ctx.lineWidth = 3;
        ctx.fill();
        ctx.strokeStyle = this.stroke;
        ctx.stroke();
    }
}

function move(e) {
    if (!isMouseDown) {
        return;
    }
    getMousePosition(e);
    //if any circle is focused
    if (focused.state) {
        circles[focused.key].x = mousePosition.x;
        circles[focused.key].y = mousePosition.y;
        draw();
        return;
    }
    //no circle currently focused check if circle is hovered
    for (var i = 0; i < circles.length; i++) {
        if (intersects(circles[i])) {
            circles.move(i, 0);
            focused.state = true;
            break;
        }
    }
    draw();
}

//set mousedown state
function setDraggable(e) {
    var t = e.type;
    if (t === "mousedown") {
        isMouseDown = true;
    } else if (t === "mouseup") {
        isMouseDown = false;
        releaseFocus();
    }
}

function releaseFocus() {
    focused.state = false;
}

function getMousePosition(e) {
    var rect = c.getBoundingClientRect();
    mousePosition = {
        x: Math.round(e.x - rect.left),
        y: Math.round(e.y - rect.top)
    }
}

//detects whether the mouse cursor is between x and y relative to the radius specified
function intersects(circle) {
    // subtract the x, y coordinates from the mouse position to get coordinates 
    // for the hotspot location and check against the area of the radius
    var areaX = mousePosition.x - circle.x;
    var areaY = mousePosition.y - circle.y;
    //return true if x^2 + y^2 <= radius squared.
    return areaX * areaX + areaY * areaY <= circle.r * circle.r;
}

Array.prototype.move = function (old_index, new_index) {
    if (new_index >= this.length) {
        var k = new_index - this.length;
        while ((k--) + 1) {
            this.push(undefined);
        }
    }
    this.splice(new_index, 0, this.splice(old_index, 1)[0]);
};
draw();

데모 보기

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

드래그 가능한 이미지에 캔버스 그리기

분류에서Dev

Tkinter : 캔버스를 드래그 가능하게 만들기

분류에서Dev

한 페이지에 여러 캔버스 그리기

분류에서Dev

JavaScript를 사용하여 드래그 가능한 JSXGraph 만들기

분류에서Dev

한 번에 여러 그래프로 장면 만들기

분류에서Dev

jQuery-드래그 가능한 항목 HTML 스타일 버그 + 원래 컨테이너로 되돌리기

분류에서Dev

드래그 가능한 이미지가 캔버스 안에 들어오지 않음

분류에서Dev

드래그 가능한 UIView 만들기

분류에서Dev

드래그 가능한 캔버스 위젯을 여러 개 사용하는 방법은 무엇입니까?

분류에서Dev

드래그 가능한 jQuery UI 기능을 여러 항목에 적용하는 방법은 무엇입니까?

분류에서Dev

캔버스에 부드러운 타원을 그리는 방법

분류에서Dev

fabric.js를 사용하여 캔버스에서 이미지를 고정, 드래그 및 선택 불가능하게 만드는 방법

분류에서Dev

D3를 사용하여 가로로 드래그 가능한 그래프 만들기

분류에서Dev

가장자리를 드래그하여 캔버스 요소 크기 조정

분류에서Dev

WPF에서 확장 가능한 원형 브래킷 그리기

분류에서Dev

변경 : 드래그 가능한 원에 레이블 추가

분류에서Dev

여러 타원 위에 여러 레이블 만들기

분류에서Dev

x 축에 여러 변수가있는 막대 그래프 만들기

분류에서Dev

여러 열에서 가능한 여러 셀 가능성을 기반으로 새 열 만들기

분류에서Dev

점 배열에서 캔버스에 여러 모양 그리기

분류에서Dev

스크롤 가능한 반응 형 그리드 뷰 만들기

분류에서Dev

Django에서 이식 가능한 노드를 만들고이를 사용하여 트리 만들기

분류에서Dev

캔버스에 여러 요소를 만드는 방법

분류에서Dev

다양한 그림에 대해 여러 모달 만들기

분류에서Dev

여러 동의어에서 가장 가능한 문장 만들기

분류에서Dev

2D 배열을 사용하여 클릭 가능한 TKinter 캔버스 만들기

분류에서Dev

swt 캔버스에 여러 직사각형 그리기

분류에서Dev

HTML 캔버스-루프에 여러 사각형 그리기

분류에서Dev

캔버스에 여러 요소 그리기

Related 관련 기사

  1. 1

    드래그 가능한 이미지에 캔버스 그리기

  2. 2

    Tkinter : 캔버스를 드래그 가능하게 만들기

  3. 3

    한 페이지에 여러 캔버스 그리기

  4. 4

    JavaScript를 사용하여 드래그 가능한 JSXGraph 만들기

  5. 5

    한 번에 여러 그래프로 장면 만들기

  6. 6

    jQuery-드래그 가능한 항목 HTML 스타일 버그 + 원래 컨테이너로 되돌리기

  7. 7

    드래그 가능한 이미지가 캔버스 안에 들어오지 않음

  8. 8

    드래그 가능한 UIView 만들기

  9. 9

    드래그 가능한 캔버스 위젯을 여러 개 사용하는 방법은 무엇입니까?

  10. 10

    드래그 가능한 jQuery UI 기능을 여러 항목에 적용하는 방법은 무엇입니까?

  11. 11

    캔버스에 부드러운 타원을 그리는 방법

  12. 12

    fabric.js를 사용하여 캔버스에서 이미지를 고정, 드래그 및 선택 불가능하게 만드는 방법

  13. 13

    D3를 사용하여 가로로 드래그 가능한 그래프 만들기

  14. 14

    가장자리를 드래그하여 캔버스 요소 크기 조정

  15. 15

    WPF에서 확장 가능한 원형 브래킷 그리기

  16. 16

    변경 : 드래그 가능한 원에 레이블 추가

  17. 17

    여러 타원 위에 여러 레이블 만들기

  18. 18

    x 축에 여러 변수가있는 막대 그래프 만들기

  19. 19

    여러 열에서 가능한 여러 셀 가능성을 기반으로 새 열 만들기

  20. 20

    점 배열에서 캔버스에 여러 모양 그리기

  21. 21

    스크롤 가능한 반응 형 그리드 뷰 만들기

  22. 22

    Django에서 이식 가능한 노드를 만들고이를 사용하여 트리 만들기

  23. 23

    캔버스에 여러 요소를 만드는 방법

  24. 24

    다양한 그림에 대해 여러 모달 만들기

  25. 25

    여러 동의어에서 가장 가능한 문장 만들기

  26. 26

    2D 배열을 사용하여 클릭 가능한 TKinter 캔버스 만들기

  27. 27

    swt 캔버스에 여러 직사각형 그리기

  28. 28

    HTML 캔버스-루프에 여러 사각형 그리기

  29. 29

    캔버스에 여러 요소 그리기

뜨겁다태그

보관