2015-04-22 2 views
1

Попытка вычислить площадь многоугольника, которая принимает (x, y) координаты до возможных 100 точек из .txt-файла с использованием перенаправления, например. ./program < file.txt
У меня возникли проблемы с сканированием на входе, чтобы моя функция вычислила область.
Вход является:Проблемы вычисления площади многоугольника в C

3 12867 1.0 2.0 1.0 5.0 4.0 5.0 

где 3 является NPOINTS и 12867 это идентификационный номер.
Это мой код, который я произвел до сих пор:

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_PTS 100 
#define MAX_POLYS 100 
#define END_INPUT 0 

// function to calculate the area of a polygon 
// think it's correct 
double polygon_area(int MAX_PTS, double x[], double y[]) 
{ 
    printf("In polygon.area\n"); 
    double area = 0.0; 
    for (int i = 0; i < MAX_PTS; ++i) 
    { 
    int j = (i + 1)%MAX_PTS; 
    area += 0.5 * (x[i]*y[j] - x[j]*y[i]); 
    } 

    printf("The area of the polygon is %lf \n", area); 

    return (area); 
} 

// having trouble reading in values from a txt file into an array 

int main(int argc, char *argv[]) { 
    int npoints, poly_id; 
    double // something should go here 

    if(scanf("%d %d", &npoints, &poly_id)) { 
    int iteration = 0; 
    struct Point initialPoint = a; 
    double area = 0; 
    scanf("%lf %lf", &, &); 
    // keep getting errors with what goes next to the & 

    for (iteration = 1; iteration < npoints; ++iteration) { 
     scanf("%lf %lf", &, &); 
     // keep getting errors with what goes next to the & 
     area += polygon_area(); // unsure what to do here 

    } 
    // now complete the polygon with last-edge joining the last-point 
    // with initial-point. 
    area += polygon_area(a, initialPoint); 

    printf("First polygon is %d\n", poly_id); 
    printf("area = %2.2lf m^2\n", area); 
    } 
    return 0; 
} 

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

+0

пожалуйста, более подробно рассказать о npoint и идентификационный номер. Каково его использование? где координаты (х, у)? –

+2

Я сомневаюсь, что 'scanf ("% lf% lf ", &, &);' будет компилироваться. Это должно как минимум читать '& a.x, & a.y' или что-то совместимое с определением Point. –

+0

Вы не можете использовать' MAX_PTS' как имя #define и имя аргумента.Это не будет работать, поскольку компилятор увидит ваше имя переменной как 100, что является недопустимым именем переменной. –

ответ

0

Вы уже обхвата для чтения вершин. Сначала прочитайте все вершины, а затем вычислите площадь. То есть вы не должны вызывать polygon_area в цикле. Вот фрагмент кода с исправлениями.

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_PTS 100 
#define MAX_POLYS 100 
#define END_INPUT 0 

// function to calculate the area of a polygon 
// think it's correct 
double polygon_area(int length, double x[], double y[]) 
{ 
    double area = 0.0; 
    int i; 
    printf("In polygon.area\n"); 
    for (i = 0; i < length; ++i) 
    { 
     int j = (i + 1) % length; 
     area += (x[i] * y[j] - x[j] * y[i]); 
    } 
    area = area/2; 
    area = (area > 0 ? area : -1 * area); 
    printf("The area of the polygon is %lf \n", area); 

    return (area); 
} 

// having trouble reading in values from a txt file into an array 

int main(int argc, char *argv[]) { 
    int npoints, poly_id; 
    double x[MAX_PTS], y[MAX_PTS]; 
    int iteration = 0; 
    double area = 0; 

    scanf("%d %d", &npoints, &poly_id); 

    for (iteration = 0; iteration < npoints; ++iteration) { 
     scanf("%lf %lf", &(x[iteration]), &(y[iteration])); 
    } 
    area = polygon_area(npoints, x, y); // unsure what to do here 

    printf("First polygon is %d\n", poly_id); 
    printf("area = %2.2lf m^2\n", area); 

    return 0; 
} 
+0

Кажется, что все работает, спасибо! – nlowe

0

Редактировать: Извините, я использую параметры командной строки здесь, а не перенаправление, как вы хотели. Вы все равно можете использовать его как: ./program $(cat test.txt) в синтаксисе bash.

Может быть, это то, что вы ищете:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int i; 
    //argc contains the number of parameters. 
    //argv[0] is the filename of the executable 
    //argv[1] has your npoints 
    int npoints = atoi(argv[1]); 
    //argv[2] has your poly_id 
    int poly_id = atoi(argv[2]); 
    double *x; 
    double *y; 
    x = malloc(sizeof(double)*npoints); //allocate space 
    y = malloc(sizeof(double)*npoints); 

    //convert the command line parameters 
    for (i=0;i<npoints;i++) { 
     x[i] = atof(argv[i*2+3]); 
     y[i] = atof(argv[i*2+4]); 
    } 

    //print them again, remove this and do your calculations here 
    for (i=0;i<npoints;i++) { 
     printf("%f %f\n", x[i], y[i]); 
    } 
} 
+0

Работает ли это с моей функцией? Извините – nlowe

3

Поскольку вы не «нуждаетесь в использовании C», вот мой подход к нему с использованием C++ (и Boost).

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

Live On Coliru

#include <boost/geometry/algorithms/area.hpp> 
#include <boost/geometry/algorithms/correct.hpp> 
#include <boost/geometry/io/io.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/geometry.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/qi_match.hpp> 

namespace qi = boost::spirit::qi; 
namespace bg = boost::geometry; 

using Point = bg::model::d2::point_xy<double, bg::cs::cartesian>; 
using Polygon = bg::model::polygon<Point>; 

namespace boost { namespace spirit { namespace traits { 
    template <> 
    struct assign_to_attribute_from_value<Point, fusion::vector2<double, double> > { 
     static void call(fusion::vector2<double, double> const& t, Point& attr) { 
      attr = Point(fusion::at_c<0>(t), fusion::at_c<1>(t)); 
     } 
    }; 
} } } 

int main() { 
    Polygon poly; 

    int npoints, poly_id; 

    if (
      (std::cin >> npoints >> poly_id) && 
      (std::cin >> std::noskipws >> qi::phrase_match(qi::repeat(npoints) [qi::attr_cast(qi::double_ >> qi::double_)], qi::blank, poly.outer())) 
     ) 
    { 
     bg::correct(poly); 
     std::cout << "Polygon: " << bg::wkt(poly) << "\n"; 
     std::cout << "Area: " << bg::area(poly) << "\n"; 
    } 
    else 
     std::cout << "Parse failed\n"; 
} 

Для данного входа он печатает:

Polygon: POLYGON((1 2,1 5,4 5,1 2)) 
Area: 4.5 

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

  • Нет связанных вопросов^_^