属于多边形的点:C 和 python 程序

如何解决属于多边形的点:C 和 python 程序

我必须用 C 和 Python 编写一个算法来知道一个点是否属于多边形(全部由用户输入)。 我的算法在 python 中工作,但 C 不起作用,我找不到我的错误,因为我的调试器代码块拒绝工作。 所以如果有人能告诉我我的错误在哪里,我将非常感激......

要求用户输入多边形的顶点数 n≥3(同时)。 我们询问他们的坐标 (For),我们将其存储在 2 个数组 (CoordX/CoordY) 中。 需要测试点的坐标 (TestX/TestY)。 我们找到了连接彼此跟随的点的直线方程 (For)。 一般情况:我们寻找 y = ax + b 的 a 和 b。 a= (y(i+1) - y(i))/(x(i+1) -x(i)); b=y-ax

特殊情况: 如果点在 x,(i+1) - i = 0 那么我们有一条方程 y = x = k(常数),b = 0;线 = 真。 如果点在 y,(i+1) - i = 0 那么我们有一条直线,方程 y = b 且 a = 0。

我们确定点是否在边界 y(i) 和 y(i+1) (For) 之间,以便知道哪条线将穿过要测试的点:Bound = True/False,我们将其存储在布尔数组,TabBorne。

如果我们趋向于无穷大(For),我们计算要测试的点将穿过的线数;我们增加 k(我们注意只使用我们将交叉的线(If))。

y=ax+bx= (y-b)/a,a≠0

特殊情况:如果一个点在一个顶点上,Vertex = True 并且这个点在图中。

我们计算触及 % 2 的行数: 如果=1,则在多边形内; 否则,它在外面。

在 Python 中:

n=0
NbCroise = 0
k = 0
CoordX = [0]*100
CoordY = [0]*100
TabA=[0]*100
TabB=[0]*100
Ligne=[0]*100
TabBorne = [0]*100
Droite = [0]*100


while n<3:
    n = int(input("Entrer le nombre de sommets >=3 : "))


for i in range (n):
    CoordX[i] = float(input("Valeur de x : "))
    CoordY[i] = float(input("Valeur de y : "))


TestX = float (input("Valeur x du point à tester : "))
TestY = float (input("Valeur y du point à tester : "))


for i in range (n-1):
    if CoordX[i+1]-CoordX[i]==0 or CoordY[i+1]-CoordY[i]==0:
        if CoordX[i+1]-CoordX[i]==0 :
            TabA[i] = CoordX[i]
            TabB[i] = 0
            Ligne[i] = True
        else :
            TabA[i] = 0
            TabB[i] = CoordY[i]
            Ligne[i] = False
    else :
        TabA[i] = (CoordY[i+1]-CoordY[i])/(CoordX[i+1]-CoordX[i])
        TabB[i] = (CoordY[i]-TabA[i]*CoordX[i])
        Ligne[i] = False
         
if CoordX[n-1]-CoordX[0]==0 or CoordY[n-1]-CoordY[0]==0:
    if CoordX[n-1]-CoordX[0]==0 :
            TabA[n-1] = CoordX[0]
            TabB[n-1] = 0
            Ligne[n-1] = True
    else :
            TabA[n-1] = 0
            TabB[n-1] = CoordY[0]
            Ligne[n-1] = False
else :
        TabA[n-1] = (CoordY[n-1]-CoordY[0])/(CoordX[n-1]-CoordX[0])
        TabB[n-1] = (CoordY[0]-TabA[n-1]*CoordX[0])
        Ligne[n-1] = False 
        
        
for i in range (n-1) :
    Borne = False
    if (CoordY[i]<=TestY and CoordY[i+1]>=TestY) or (CoordY[i]>=TestY and CoordY[i+1]<=TestY):
        Borne = True
    TabBorne[i] = Borne
       
Borne = False
if (CoordY[n-1]<=TestY and CoordY[0]>=TestY) or (CoordY[n-1]>=TestY and CoordY[0]<=TestY):
        Borne = True
TabBorne[n-1] = Borne


for i in range (n):
    if TabBorne[i] == True:
        if Ligne[i] == True:
            Droite[k] = TabA[i]
        elif TabA[i] != 0 :
            Droite[k] = ((TestY-TabB[i])/TabA[i])
        k = k + 1
     
               
for i in range (k):
    if TestX<=Droite[i]:
               NbCroise = NbCroise+1
     

Sommet = False
for i in range(n):
    if TestX == CoordX[i] and TestY == CoordY[i]:
        Sommet = True
        

if Sommet == True:     
    print ("Le point est dans la figure.")
elif NbCroise % 2 == 0:
    print ("Le point n'est pas dans la figure.")
else:
    print ("Le point est dans la figure.")

在 C:

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

int main()
{
    int i,n,k,NbCroise,Borne,Sommet,TabBorne[100],Ligne[100];
    float TestX,TestY,CoordX[100],CoordY[100],TabA[100],TabB[100],Droite[100];

    Sommet = 0;
    NbCroise = 0;
    k = 0;
    n = 0;

    while (n<3)
        {printf("Entrer le nombre de sommets >=3 \n");
        scanf ("%d",&n) ;}

    for (i=0;i<n;i=i+1)
        {printf("Valeur de x :\n");
        scanf ("%f",&CoordX[i]);
        printf("Valeur de y :\n");
        scanf ("%f",&CoordY[i]);}

    printf("Valeur x du point a tester :\n");
    scanf ("%f",&TestX);
    printf("Valeur y du point a tester :\n");
    scanf ("%f",&TestY);

    for (i=0;i<(n-1);i=i+1)
        {if (((CoordX[i+1]-CoordX[i])==0) || ((CoordY[i+1]-CoordY[i])==0))
            {if ((CoordX[i+1]-CoordX[i])==0)
                {TabA[i] = CoordX[i];
                TabB[i] = 0;
                Ligne[i] = 1;}
            else
                {TabA[i] = 0;
                TabB[i] = CoordY[i];
                Ligne[i] = 0;}}
        else
            {TabA[i] = ((CoordY[i+1]-CoordY[i])/(CoordX[i+1]-CoordX[i]));
            TabB[i] = (CoordY[i]-(TabA[i]*CoordX[i]));
            Ligne[i] = 0;}
        }

    if (((CoordX[n-1]-CoordX[0])==0) || ((CoordY[n-1]-CoordY[0])==0))
            {if ((CoordX[n-1]-CoordX[0])==0)
                {TabA[n-1] = CoordX[0];
                TabB[n-1] = 0;
                Ligne[n-1] = 1;}
            else
                {TabA[n-1] = 0;
                TabB[n-1] = CoordY[0];
                Ligne[n-1] = 0;}}
    else
        {TabA[n-1] = ((CoordY[n-1]-CoordY[0])/(CoordX[n-1]-CoordX[0]));
        TabB[n-1] = (CoordY[0]-(TabA[n-1]*CoordX[0]));
        Ligne[n-1] = 0;}


    for (i=0;i<(n-1);i=i+1)
        {Borne = 0;
        if (((CoordY[i]<=TestY) && (CoordY[i+1]>=TestY)) || ((CoordY[i]>=TestY) && (CoordY[i+1]<=TestY)))
            {Borne = 1;
            TabBorne[i] = Borne;}}

    Borne = 0;
        if (((CoordY[n-1]<=TestY) && (CoordY[0]>=TestY)) || ((CoordY[n-1]>=TestY) && (CoordY[0]<=TestY)))
            {Borne = 1;
            TabBorne[n-1] = Borne;}

    for (i=0;i<n;i=i+1)
        {if (TabBorne[i] == 1)
            {if (Ligne[i] == 1)
                {Droite[k] = TabA[i];}
                k = (k+1);}
            else if (TabA[i] != 0)
                {Droite[k] = ((TestY-TabB[i])/TabA[i]);
                k = (k+1);}}

    for (i=0;i<k;i=i+1)
        {if (TestX <= Droite[i])
            NbCroise = (NbCroise + 1);}


    for (i=0;i<n;i=i+1)
        {if ((TestX == CoordX[i]) && (TestY == CoordY[i]))
            Sommet = 1;}


    if (Sommet == 1)
        {printf("Le point est dans la figure.\n");}
    else if (NbCroise % 2 == 0)
        {printf("Le point n'est pas dans la figure.\n");}
    else
        {printf("Le point est dans la figure.\n");}

    return 0;
}

解决方法

  1. 第一个问题是在这部分代码中:
    for (i=0;i<(n-1);i=i+1)
        {Borne = 0;
        if (((CoordY[i]<=TestY) && (CoordY[i+1]>=TestY)) || ((CoordY[i]>=TestY) && (CoordY[i+1]<=TestY)))
            {Borne = 1;
            TabBorne[i] = Borne;}}

    Borne = 0;
        if (((CoordY[n-1]<=TestY) && (CoordY[0]>=TestY)) || ((CoordY[n-1]>=TestY) && (CoordY[0]<=TestY)))
            {Borne = 1;
            TabBorne[n-1] = Borne;}

对比Python代码,应该是这样的:

    for (i=0;i<(n-1);i=i+1)
        {Borne = 0;
        if (((CoordY[i]<=TestY) && (CoordY[i+1]>=TestY)) || ((CoordY[i]>=TestY) && (CoordY[i+1]<=TestY)))
            {Borne = 1;}
        TabBorne[i] = Borne;}

    Borne = 0;
        if (((CoordY[n-1]<=TestY) && (CoordY[0]>=TestY)) || ((CoordY[n-1]>=TestY) && (CoordY[0]<=TestY)))
            {Borne = 1;}
        TabBorne[n-1] = Borne;

第二个 if 语句的缩进是错误的,但 C 并不关心缩进。

  1. 第二个问题在这里:
    for (i=0;i<n;i=i+1)
        {if (TabBorne[i] == 1)
            {if (Ligne[i] == 1)
                {Droite[k] = TabA[i];}
                k = (k+1);}
            else if (TabA[i] != 0)
                {Droite[k] = ((TestY-TabB[i])/TabA[i]);
                k = (k+1);}}

如果上面的代码缩进以匹配 { } 大括号的位置,它看起来像这样:

    for (i=0;i<n;i=i+1)
        {if (TabBorne[i] == 1)
            {if (Ligne[i] == 1)
                {Droite[k] = TabA[i];}
            k = (k+1);}
        else if (TabA[i] != 0)
            {Droite[k] = ((TestY-TabB[i])/TabA[i]);
        k = (k+1);}}

对比Python代码,应该是这样的:

    for (i=0;i<n;i=i+1)
        {if (TabBorne[i] == 1)
            {if (Ligne[i] == 1)
                {Droite[k] = TabA[i];}
            else if (TabA[i] != 0)
                {Droite[k] = ((TestY-TabB[i])/TabA[i]);}
            k = (k+1);}}

C 不关心缩进,但它确实关心你把大括号放在哪里!

  1. 代码中的大括号 ({ }) 放置样式非常非常规且难以阅读。我建议切换到一种更流行的风格,例如 K&R styleAllman styleOne True Brace styleWhitesmiths style 或(恐怖的)GNU style

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?