JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N68
terranum
28 уровень

Кухня(); Задание N68

Статья из группы Архив info.javarush
участников
Кухня(); Задание N68 - 1 Правила [Одномерные массивы] 68. На плоскости n точек заданы своими координатами и также дана окружность радиуса R с центром в начале координат. Указать множество всех треугольников с вершинами в заданных точках, пересекающихся с окружностью; множество всех треугольников, содержащихся внутри окружности.
Комментарии (6)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Airon
Уровень 34
10 октября 2014, 16:00
Ну что же, пока никто лучше ничего не предложил, вот вариант в лоб:
public static void solveBD2(PointBD[] points, PointBD c, BigDecimal r) {
    if(points.length < 3)
        throw new IllegalArgumentException("Bad array");
    BigDecimal r2 = r.multiply( r);
    listCrossBD = new LinkedList<PointBD[]>();  //в самом классе private static List<PointBD[]> listCrossBD;
    listInsideBD = new LinkedList<PointBD[]>(); //в самом классе private static List<PointBD[]> listInsideBD;
    for (int i = 0; i < points.length - 2; i++)
        for (int j = i + 1; j < points.length - 1; j++)
            for (int k = j + 1; k < points.length; k++)
                if( points[i].distTo2( c).compareTo(r2) > 0
                 && points[j].distTo2( c).compareTo(r2) > 0
                 && points[k].distTo2( c).compareTo(r2) > 0 )
                    continue;
                else if( points[i].distTo2( c).compareTo(r2) > 0
                      || points[j].distTo2( c).compareTo(r2) > 0
                      || points[k].distTo2( c).compareTo(r2) > 0 )
                    listCrossBD.add(new PointBD[]{points[i], points[j], points[k]});
                else
                    listInsideBD.add(new PointBD[]{points[i], points[j], points[k]});
}

class PointBD {
    private BigDecimal x;
    private BigDecimal y;

    PointBD(BigDecimal x, BigDecimal y) {
        this.x = x;
        this.y = y;
    }

    public BigDecimal distTo2(PointBD p) {
        return this.x.subtract(p.x).multiply(this.x.subtract(p.x)).add(this.y.subtract(p.y).multiply(this.y.subtract(p.y))).setScale(10, BigDecimal.ROUND_HALF_UP);
    }

    @Override
    public String toString() {
        return String.format("{%.3f, %.3f}", x, y);
    }
}
Vash_the_Stampede
Уровень 11
10 октября 2014, 18:12
а зачем BigDecimal?
Airon
Уровень 34
10 октября 2014, 18:50
Потрогать так сказать, что оно такое. Хотя сначала думал про банальное
varDouble1 - varDouble2 > eps

Потом хотел как то обойти, пришел к BigDecimal, но в конце концов там тоже надо указывать кол-во значащих разрядов и способ округления в setScale, так что потрогать-покрутить…
Vash_the_Stampede
Уровень 11
11 октября 2014, 21:59
я, в принципе, о такой же схеме думал, но только есть загвоздка:

Нужно это просчитать, плюс, считается ли пересечением касание?
Airon
Уровень 34
12 октября 2014, 11:12
В общем надо все переделывать под что то такое:
Считаем кратчайшее расстояние от центра круга до отрезка, если меньше радиуса, то отрезок внутри круга полностью или частично

Airon
Уровень 34
12 октября 2014, 16:13
Ну вляпался же с этими BigDecimal, теперь пляшу от них…
public static void solveBD(PointBD[] points, PointBD c, BigDecimal r) {
    if(points.length < 3)
        throw new IllegalArgumentException("Bad array");
    PointBD.setDigits(15);
    BigDecimal r2 = r.multiply( r).setScale(PointBD.getDigits(), BigDecimal.ROUND_HALF_UP);
    listCrossBD = new LinkedList<PointBD[]>();     // в переменных класса private static List<PointBD[]> listCrossBD;
    listInsideBD = new LinkedList<PointBD[]>();    // в переменных класса private static List<PointBD[]> listInsideBD;
    for (int i = 0; i < points.length - 2; i++)
        for (int j = i + 1; j < points.length - 1; j++) {
            if(!points[i].equals(points[j])) {
                for (int k = j + 1; k < points.length; k++) {
                    if(!points[i].equals(points[k]) &&  !points[j].equals(points[k])) {
                        if( points[i].distTo2( c).compareTo(r2) > 0
                         && points[j].distTo2( c).compareTo(r2) > 0
                         && points[k].distTo2( c).compareTo(r2) > 0 ) {
                            if( c.normal2(points[i], points[j]).compareTo(r2) < 0
                             || c.normal2(points[i], points[k]).compareTo(r2) < 0
                             || c.normal2(points[j], points[k]).compareTo(r2) < 0 ) {
                                listCrossBD.add(new PointBD[]{points[i], points[j], points[k]});
                            }
                        } else if( points[i].distTo2( c).compareTo(r2) > 0
                                || points[j].distTo2( c).compareTo(r2) > 0
                                || points[k].distTo2( c).compareTo(r2) > 0 )
                            listCrossBD.add(new PointBD[]{points[i], points[j], points[k]});
                        else
                            listInsideBD.add(new PointBD[]{po