2015-12-30 4 views
4

Я пытаюсь нарисовать круг, нажав и перетащив указатель мыши. То, как вы будете делать в PowerPoint или что-то в этом роде. Центр круга появляется в странных местах, и я не могу это объяснить.Рисование круга с помощью мыши.

Вот jsfiddle: https://jsfiddle.net/h8t3hfa2/2/

Это, как я получить начальную и конечную позицию;

$('#c').mousedown(function(event) { 
    var parentOffset = $(this).offset(); 
    circle = new Circle(); 
    circle.start['x'] = event.pageX - parentOffset.left; 
    circle.start['y'] = event.pageY - parentOffset.top; 

}); 

$('#c').mouseup(function(event) { 
    var parentOffset = $(this).offset(); 
    circle.end['x'] = event.pageX - parentOffset.left; 
    circle.end['y'] = event.pageY - parentOffset.top; 
    circle.draw(canvas[0]); 

}); 

При консолидации журнала средняя точка выглядит правильно, но круг появляется где-то в другом месте. Есть идеи?

+0

Проверить эти предыдущие Stackoverflow Q & A: Рисование окружности [наружу от начальной точки сопротивления] (http://stackoverflow.com/questions/28727125/paint-app-in-canvas/28736415#28736415) ** и ** Рисование круга [между начальными и конечными точками перетаскивания] (http://stackoverflow.com/questions/28727125/paint-app-in-canvas/28736415#28736415): ** – markE

ответ

6

Это происходит потому, что вы масштабируете свой холст с помощью CSS. Помните, размеры холста отличаются от размеров холста CSS (стиля).

Быстрое исправление для выравнивания их:

canvas.get(0).width = canvas.width(); 
canvas.get(0).height = canvas.height(); 

https://jsfiddle.net/h8t3hfa2/3/

var Circle = function() { 
 
    this.start = []; 
 
    this.end = []; 
 
} 
 
Circle.prototype.draw = function(canvas) { 
 
    var me = this; 
 

 
    if (canvas.getContext) { 
 
    var ctx = canvas.getContext('2d'); 
 
    var mid = me.getcenter(); 
 
    var rad = me.getradius(); 
 
    console.log(mid, rad); 
 
    ctx.beginPath(); 
 
    console.log(mid['x'], mid['y']); 
 
    ctx.arc(mid['x'], mid['y'], rad, 0, 360); 
 
    ctx.stroke(); 
 
    } 
 

 
}; 
 

 
Circle.prototype.getcenter = function() { 
 
    var me = this; 
 
    //Check the start and end are set 
 
    var centerX = (me.start['x'] + me.end['x'])/2; 
 
    var centerY = (me.start['y'] + me.end['y'])/2; 
 

 
    return { 
 
    'x': centerX, 
 
    'y': centerY 
 
    }; 
 
}; 
 

 
Circle.prototype.getradius = function() { 
 
    var me = this; 
 
    var distX = Math.abs(me.start['x'] - me.end['x']); 
 
    var distY = Math.abs(me.start['y'] - me.end['y']); 
 

 
    return distX/2; 
 
}; 
 

 
var circle; 
 
var canvas = $('#c'); 
 

 
// added only these two lines 
 
canvas.get(0).width = canvas.width(); 
 
canvas.get(0).height = canvas.height(); 
 

 
$('#c').mousedown(function(event) { 
 
    var parentOffset = $(this).offset(); 
 
    circle = new Circle(); 
 
    circle.start['x'] = event.pageX - parentOffset.left; 
 
    circle.start['y'] = event.pageY - parentOffset.top; 
 

 
}); 
 

 
$('#c').mouseup(function(event) { 
 
    var parentOffset = $(this).offset(); 
 
    circle.end['x'] = event.pageX - parentOffset.left; 
 
    circle.end['y'] = event.pageY - parentOffset.top; 
 
    circle.draw(canvas[0]); 
 

 
});
canvas {background-color: white;height: 100%;width: 100%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<canvas id='c'></canvas>

Вы, вероятно, следует также добавить OnResize обработчик событий, чтобы сбросить размеры холста, когда окно размер изменяется, потому что вы используете жидкую компоновку. Будьте осторожны, однако, изменение размеров холста (даже до исходного размера) приведет к очистке холста.

+0

Ага, это также объясняет, почему мои круги были искажены. Большое спасибо. – dan08

+0

Yup, зубчатые края были мертвой распродажей, что некоторые искажения CSS продолжаются. Пожалуйста! – Shomz

0

Удаление height: 100%; width: 100%; из стилей исправления устраняет проблему.

Не по теме, но я предлагаю редактирование getradius использовать мин (или более) из distX и distY (вместо жесткого кодирования distX) как приложения, которые вы упомянули.

Circle.prototype.getradius = function() { 
    var me = this; 
    var distX = Math.abs(me.start['x'] - me.end['x'])/2; 
    var distY = Math.abs(me.start['y'] - me.end['y'])/2; 

    return Math.min(distX, distY); 
}; 
+0

100% высота и ширина есть по какой-то причине, так что это не устраняет проблему, а устраняет ее. – Shomz

+0

Хорошо, я сожалею об этом. Я просто пытался помочь, указав, в чем причина проблемы. Я обновил свой ответ, чтобы сказать, что он «избегает» проблемы. Надеюсь, все в порядке. :/ – sina

+0

Не беспокойтесь, конечно, все в порядке, я просто хотел, чтобы вы улучшили свой ответ, потому что этот изменяет макет веб-страницы, чего не хочет OP (я считаю). Проблема в том, что ширина и высота холста отличаются от ширины и высоты холста CSS. :) – Shomz

Смежные вопросы