2013-09-13 1 views
0

Я пытаюсь написать программу, которая решает, находится ли круг внутри/касаясь прямоугольника. Пользователь ставит в центр точки для круга и радиуса и две диагональные точки для прямоугольника.Если утверждение, похоже, пропущено в другое

Я не уверен, как включить все точки окружности круга, чтобы сказать, что есть хотя бы одна точка в/касание прямоугольника. Кто-нибудь уверен, как это сделать?

Когда я запускаю свою текущую программу, я намеренно вводим точки круга внутри прямоугольника и должен работать с операторами if, которые я положил, но он печатает неправильный ответ.

import java.util.Scanner; 
public class lab4 { 
public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    double cx, cy, x, y, r, p1x, p1y, p2x, p2y, max;//input 
    String a; 

    System.out.print("Enter cx: "); 
    cx = in.nextDouble(); 
    System.out.print("Enter cy: "); 
    cy = in.nextDouble();  
    System.out.print("Enter r: "); 
    r = in.nextDouble(); 

    System.out.println("Enter x value of point 1:"); 
    p1x = in.nextDouble(); 
    System.out.println("Enter y value of point 1:"); 
    p1y = in.nextDouble(); 
    System.out.println("Enter x value of point 2:"); 
    p2x = in.nextDouble(); 
    System.out.println("Enter y value of point 2:"); 
    p2y = in.nextDouble(); 


    max = p2x; 
    if (p1x > max) 
     max = p1x; 

    max = p2y; 
    if (p1y > max) 
     max = p1y; 

    if (cx >= p1x && cx <= p2x) 
     a = "Circle is inside of Rectangle"; 
    if (cx >= p1x && cx <= p2x) 
     a = "Circle is inside of Rectangle"; 
    if (cx+r >= p1x && cx+r <= p2x) 
     a = "Circle is inside of Rectangle"; 
    if (cx-r >= p1x && cx-r <= p2x) 
     a = "Circle is inside of Rectangle"; 
    if (cy >= p1y && cy <= p2y) 
     a = "Circle is inside of Rectangle"; 
    if (cy >= p1y && cy <= p2y) 
     a = "Circle is inside of Rectangle"; 
    if (cy+r >= p1y && cy+r <= p2y) 
     a = "Circle is inside of Rectangle"; 
    if (cy-r >= p1y && cy-r <= p2y) 
     a = "Circle is inside of Rectangle"; 
    else 
     a = "Circle is outside of Rectangle"; 

    System.out.println(a); 
+0

ваш else только для последнего, если не для всех, возможно, вы переопределяете значение, вместо этого я предлагаю ** объединить каждый результат в переменную a ** и увидеть их все –

ответ

1

Ваше другое выражение относится только к последней инструкции if. Поэтому, если последний аргумент if равен false, ваш оператор else выполняется. Вероятно, вы, скорее всего, захотите:

if ... 
else if ... 
else if ... 
else 

, который выполняет остальное, только если все предыдущие утверждения «если» являются ложными.

0

Поскольку вы не использовали else if для каждого из условий, последний if и else пара утверждений перекроет все предыдущие if с.


             
  
    if (cx >= p1x && cx <= p2x) a = "Circle is inside of Rectangle"; if (cx >= p1x && cx <= p2x) a = "Circle is inside of Rectangle"; if (cx+r >= p1x && cx+r <= p2x) a = "Circle is inside of Rectangle"; if (cx-r >= p1x && cx-r <= p2x) a = "Circle is inside of Rectangle"; if (cy >= p1y && cy <= p2y) a = "Circle is inside of Rectangle"; if (cy >= p1y && cy <= p2y) a = "Circle is inside of Rectangle"; if (cy+r >= p1y && cy+r <= p2y) a = "Circle is inside of Rectangle"; 
   
if (cy-r >= p1y && cy-r <= p2y) 
    a = "Circle is inside of Rectangle"; 
else 
    a = "Circle is outside of Rectangle";

Make sure to use else if для каждой из альтернатив, обеспечивающих выполнение только одного из блоков.

if (cx >= p1x && cx <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx >= p1x && cx <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx+r >= p1x && cx+r <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx-r >= p1x && cx-r <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cy >= p1y && cy <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy >= p1y && cy <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy+r >= p1y && cy+r <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy-r >= p1y && cy-r <= p2y) 
    a = "Circle is inside of Rectangle"; 
else 
    a = "Circle is outside of Rectangle"; 

(Эта поправка будет фиксировать непосредственную проблему, но алгоритм в целом по-прежнему неправильно.)

-1

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

Я предлагаю сцепить каждый результат переменной a, как это увидеть, какие условия являются действительными:

if (cx >= p1x && cx <= p2x) 
    a += "Circle is inside of Rectangle \n"; 
if (cx >= p1x && cx <= p2x) 
    a += "Circle is inside of Rectangle\n"; 
if (cx+r >= p1x && cx+r <= p2x) 
    a += "Circle is inside of Rectangle\n"; 
if (cx-r >= p1x && cx-r <= p2x) 
    a += "Circle is inside of Rectangle\n"; 
if (cy >= p1y && cy <= p2y) 
    a += "Circle is inside of Rectangle\n"; 
if (cy >= p1y && cy <= p2y) 
    a += "Circle is inside of Rectangle\n"; 
if (cy+r >= p1y && cy+r <= p2y) 
    a += "Circle is inside of Rectangle\n"; 
if (cy-r >= p1y && cy-r <= p2y) 
    a += "Circle is inside of Rectangle\n"; 
else 
    a += "Circle is outside of Rectangle\n"; 

Или, если это не то, что вы хотите добавить еще, если все ваши, если заявления, как это:

if (cx >= p1x && cx <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx >= p1x && cx <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx+r >= p1x && cx+r <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cx-r >= p1x && cx-r <= p2x) 
    a = "Circle is inside of Rectangle"; 
else if (cy >= p1y && cy <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy >= p1y && cy <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy+r >= p1y && cy+r <= p2y) 
    a = "Circle is inside of Rectangle"; 
else if (cy-r >= p1y && cy-r <= p2y) 
    a = "Circle is inside of Rectangle"; 
else 
    a = "Circle is outside of Rectangle"; 
0

Как уже говорилось, вам нужна цепочка if ... else if ... else if ... else для правильной работы вашей логики.

Однако есть более простой подход. Чтобы проверить, касается ли какая-либо часть круга или находится внутри прямоугольника, просто разверните прямоугольник по радиусу круга, а затем проверьте, находится ли центр круга внутри или на расширенном прямоугольнике. Так как вы используете двойные координаты, вы можете использовать Rectangle.Double делать всю тяжелую работу:

public static void main(String[] args) { 
    double cx, cy, r, p1x, p1y, p2x, p2y; 

    // first input cx, cy, r, p1x, p1y, p2x, and p2y 

    // construct a zero-width/height rectangle at p1 
    Rectangle2D.Double p1 = new Rectangle2D.Double(p1x, p1y, 0, 0); 

    // construct another one at p1 
    Rectangle2D.Double p2 = new Rectangle2D.Double(p2x, p2y, 0, 0); 

    // construct the union of the two 
    Rectangle2D.Double rect = p1.createUnion(p2); 

    // expand the rectangle 
    rect.setBounds(rect.x - r, rect.y - r, rect.w + 2 * r, rect.h + 2 * r); 

    // test for containment 
    if (rect.contains(cx, cy) { 
     a = "Circle is inside of Rectangle"; 
    } else { 
     a = "Circle is outside of Rectangle"; 
    } 
    System.out.println(a); 
} 
0

Некоторые псевдокод:

Сдвиг круг начала координат, чтобы сделать вещи проще. Сдвиньте прямоугольник на ту же сумму.

p1x = p1x - cx 
p2x = p2x - cx 
p1y = p1y - cy 
p2y - p2y - cy 

x^2 + y^2 = r^2 
y = +- sqrt(r^2 - x^2) 

For x = -r to r 

    y = + sqrt(r^2 - x^2) 

    if (Inbounds(x,y))return true; 

    y = - sqrt( r^2 - x^2) 

    if (Inbounds(x,y))return true; 

End For 

Для повышения точности вы могли бы сделать что-то вроде:

Для х = -r к г Шаг 0.01 (использование удваивается и увеличивается на 0,01)