2013-11-10 4 views
-1

Я пишу программу Java, которая точно имитирует Microsoft Paint. Он может рисовать четыре разных формы: линии, овалы, прямоугольники и квадраты. Я очень близок к этому, но я придерживаюсь логики рисования квадратов.Рисование квадрата путем перетаскивания мыши

Во время рисования этих фигур есть два предмета. Первая точка (точка 1) - это когда пользователь нажимает кнопку мыши, а вторая точка (точка2), пока пользователь перетаскивает мышь через холст. Я считаю, что рисование Rectangles и Squares должно быть очень похожим, но часть, которая меня смутила, - это рисование квадрата, стороны равны по длине, так что point2 не совсем там, где находится мышь.

Вот FillRect() метод заголовок для справки:

fillRect(x, y, width, height) 

Моей работа код для рисования прямоугольников следующим образом:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
      ((point1.y < point2.y) ? point1.y : point2.y), 
      Math.abs(point2.x - point1.x), 
      Math.abs(point2.y - point1.y)); 

Я попытался использовать тот же код для рисования квадратов, за исключением изменения параметр высоты должен быть равен параметру ширины, так как квадраты имеют одинаковые стороны длины:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
      ((point1.y < point2.y) ? point1.y : point2.y), 
      Math.abs(point2.x - point1.x), 
      Math.abs(point2.x - point1.x)); //same as width 

Я не знаю, в чем проблема, если сделать ширину и высоту равными. Он работает при рисовании вниз влево или вправо, но, конечно, форма не расширяется, если вы тянете прямо вниз. Нажатие и перетаскивание не работает; квадрат просто перемещается мышью вдоль оси Y, а не расширяется.

Может ли кто-нибудь указать мне в правильном направлении относительно логики рисования квадрата из двух точек?

Я могу объяснить свой код немного лучше, если потребуется.

+0

Для более эффективной помощи, отправьте сообщение [SSCCE] (http://sscce.org/). –

ответ

0

Вы должны сделать два вычисления в методе MouseDragged - сначала вы должны вычислить две угловые точки прямоугольника, p1 и p2, и только тогда вы должны вычислить ширину. Точка p1 проста - это всегда первая точка нажата, но p2 потребует простого вычисления. Как только они будут выяснены, ваши расчеты должны выпадать правильно.

т.е. что-то вроде:

int width = Math.abs(pointA.x - pointB.x); 
    int height = Math.abs(pointA.y - pointB.y); 

    width = Math.max(width, height); 
    height = width; 

    int x = pointA.x > pointB.x ? pointA.x - width : pointA.x; 
    int y = pointA.y > pointB.y ? pointA.y - width : pointA.y; 

    g.fillRect(x, y, width, height); 
0

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

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

Я не знаю, почему рисунок идет наперекосяк - трудно быть уверенным, что я понимаю, что вы говорите, идет не так.

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