私はほとんどの場合Python開発者ですが、最近Cを使用していくつかの問題を解決する必要があり、正直なところ、それは私を苦しめています。
func.c
#define _CRT_SECURE_NO_WARNINGS
#define M_PI 3.1415926535897932384626433832795028841971693993751058209
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
#include "Point.h"
bool point_on_line(struct Point p1, struct Point p2, struct Point point) {
double min_x = min(p1.x, p2.x);
double max_x = max(p1.x, p2.x);
double min_y = min(p1.y, p2.y);
double max_y = max(p1.y, p2.y);
if (p2.y - p1.y == 0) {
return point.y == p2.y && point.x >= min_x && point.x <= max_x && point.y >= min_y && point.y <= max_y;
}
if (p2.x - p1.x == 0) {
return point.x == p2.x && point.x <= max_x && point.x >= min_x && point.y >= min_y && point.y <= max_y;
}
double k = (p2.y - p1.y) / (p2.x - p1.x);
double b = (p2.x * p1.y - p1.x * p2.y) / (p2.x - p1.x);
return point.y == (k * point.x + b) && point.x >= min_x && point.x <= max_x && point.y >= min_y && point.y <= max_y;
}
double calculate_angle(struct Point p1, struct Point p2) {
double dot_product = p1.x * p2.x + p1.y * p2.y;
double lenp1 = sqrt(p1.x * p1.x + p1.y * p1.y);
double lenp2 = sqrt(p2.x * p2.x + p2.y * p2.y);
double orientation = p1.x * p2.y - p1.y * p2.x;
int sign;
if (orientation > 0) {
sign = 1;
}
else {
sign = -1;
}
return sign * acos(dot_product / (lenp1 * lenp2));
}
bool check_border(struct Point p, struct Point points[], int size) {
for (int i = 0; i < size - 1; i++) {
if (point_on_line(points[i], points[i + 1], p)) {
return true;
}
}
return false;
}
bool calc_angle_sum(struct Point p1, struct Point points[], int size) {
struct Point* vectors = malloc(size * sizeof(struct Point));
for (int i = 0; i < size; i++) {
struct Point temp = { points[i].x - p1.x,points[i].y - p1.y };
vectors[i] = temp;
}
double total_sum = 0;
for (int i = 0; i < size - 1; i++) {
total_sum += calculate_angle(vectors[i], vectors[i + 1]);
}
bool res = (fabs(total_sum - 2 * M_PI)) < 0.00005;
printf("TOTAL SUM %.100f\n", total_sum);
printf("DIFFERENCE SMALL %d\n", fabs(total_sum - 2 * M_PI) < 0.00005);
return fabs(total_sum - 2 * M_PI) < 0.00005;
//return res;
}
Source.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Point.h"
int main() {
int length = 5;
struct Point p1 = { 1,2 };
struct Point p2 = { 5,0 };
struct Point p3 = { 7,4 };
struct Point p4 = { 5,6 };
struct Point p5 = { 2,5 };
struct Point p6 = { 1,2 };
struct Point points_test[6] = {p1,p2,p3,p4,p5,p6};
struct Point point_test = {7,3};
//bool result = calc_angle_sum(point, points, length + 1);
//printf("%s", result ? "true\n" : "false\n");
if (check_border(point_test, points_test, length + 1)) {
printf("BORDER");
return 0;
}
else if (calc_angle_sum(point_test, points_test, length + 1)) {
printf("INSIDE");
return 0;
}
else {
printf("OUTSIDE");
return 0;
}
}
Point.h
#pragma once
struct Point {
double x, y;
};
Coordinates.txt
1 2 5 0 7 4 5 6 2 5
lap.txt(最初の数値は長方形の頂点の数、2番目と3番目はポイントの座標です。
5 7 3
このアルゴリズムは、回転数法を使用して、ポイントが特定のポリゴンのエッジの内側/外側/エッジ上にあるかどうかを判断します。
ポイント(7,3)
(内側の2番目と3番目の数字lap.txt
)はポリゴンの外側にあるため、正解は「OUTSIDE / FALSE」です。それでも、デバッグ/リリースやcalc_angle_sum
関数からの復帰方法によって出力は異なります。
私がこのように戻るとき:
return fabs(total_sum - 2 * M_PI) < 0.00005;
デバッグ/リリースモードによっては、一貫性のない結果が得られます。
ただし、次の方法は問題なく機能するようです。
bool res = (fabs(total_sum - 2 * M_PI)) < 0.00005
return res
以下は、Source.c
メソッドを呼び出す内部の部分です。
else if (calc_angle_sum(point, points, length + 1)) {
printf("INSIDE");
return 0;
}
Cで式がどのように評価されるかについて理解できないことがあります。
Pythonでは、likeを返すreturn <some_expression>
ことに慣れており、に変換されることを期待していますTrue/False
。ただし、Cでは、これは正しくないようです。そうでない場合は、他のエラーが発生します。
明らかな問題の1つは、暗黙的な関数宣言の問題です。
どちらでもない
bool calc_angle_sum(struct Point p1, struct Point points[], int size)
そして
bool check_border(struct Point p, struct Point points[], int size)
翻訳ユニットでは宣言されていませんsource.c
。したがって、コンパイラは関数が型であると想定します
int calc_angle_sum()
int check_border()
関数の戻り値の型である場合int
、これらの引数を使用して、この方法で互換性を持って呼び出すことができます。ただし、関数の実際の戻り値の型はであるため、bool
関数呼び出しの動作は未定義です。
C99は暗黙の関数定義を削除しました。準拠したC99、C11、C17コンパイラは、これらの関数呼び出しについて文句を言う必要があります。source.c
しかし、標準以下のMSVCコンパイラは、長く廃止されたC89仕様をほとんど満たしていません。
したがって、宣言してみてください
bool calc_angle_sum(struct Point p1, struct Point points[], int size);
bool check_border(struct Point p, struct Point points[], int size);
Point.hで。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加