Regular polygon

本文介绍了一种算法,用于计算平面上给定整数坐标点能构成的不同正多边形的数量,特别关注正方形的情况,并提供了一个具体的C++实现。
On a two-dimensional plane, give you n integer points. Your task is to figure out how many different regular polygon these points can make.
Input
The input file consists of several test cases. Each case the first line is a numbers N (N <= 500). The next N lines ,each line contain two number Xi and Yi(-100 <= xi,yi <= 100), means the points’ position.(the data assures no two points share the same position.)
Output
For each case, output a number means how many different regular polygon these points can make.
Sample Input
4
0 0
0 1
1 0
1 1
6
0 0
0 1
1 0
1 1
2 0
2 1
Sample Output
1

2

因为给的点坐标全是整数,那么就是计算正四边形的个数,只有正方形才可以使所有的点为整数点。那么由两个点便可以得到可能满足正方形情况的两个点,判断这两个点是否存在就好了,注意在计算的过程中每个正方形有四条边所以会被统计四遍,最终结果应是 ans/4。 
PS:给的数据点的范围是[-100,100],因此对点的坐标+100进行处理。

已知: (x1,y1) (x2,y2) 
则: x3=x1+(y1-y2) y3= y1-(x1-x2) 
x4=x2+(y1-y2) y4= y2-(x1-x2) 
或 
x3=x1-(y1-y2) y3= y1+(x1-x2) 
x4=x2-(y1-y2) y4= y2+(x1-x2)

一般的在横坐标 或 纵坐标都相同的就不考虑了,(x1-x2)或(y1-y2)为0,一定满足 
我们只考虑在如下情况的正方形

图一 当(x1, y1) (x2,y2)在如下位置时 他能找到的(x3,y3)(x4,y4) 有实线和虚线 围成的两种方案

这里写图片描述

同理,还有另外一种2种排法

这里写图片描述

因此,确定2个点(一条边) 都能找到与之对应的 2个四边形,那么4条边 就有8个 但4个是重复的 所以 /4

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int book[500][500];
int main()
{
    int xx[10000];
    int yy[10000];
    int n,m,i,j,x1,y1,x2,y2,x3,y3,x4,y4;
    while(scanf("%d",&n)!=EOF)
    {
        int sum=0;
        memset(book,0,sizeof(book));
        for(i=0; i<n; i++)
        {
            scanf("%d %d",&xx[i],&yy[i]);
            xx[i]+=100;
            yy[i]+=100;
            book[xx[i]][yy[i]]=1;
        }
        for(i=0; i<n; i++)
        {
            for(j=i+1; j<n; j++)
            {
                int dx,dy;
                dx=xx[j]-xx[i];
                dy=yy[j]-yy[i];
                x1=xx[j];
                x2=xx[i];
                y1=yy[j];
                y2=yy[i];
                if(x1+dy>=0&&x1+dy<=200&&
                   y1-dx>=0&&y1-dx<=200&&
                   x2+dy>=0&&x2+dy<=200&&
                   y2-dx>=0&&y2-dx<=200&&
                   book[x1+dy][y1-dx]==1&&
                   book[x2+dy][y2-dx]==1)
                {
                    sum++;
                }
                if(x1-dy>=0&&x1-dy<=200&&
                   y1+dx>=0&&y1+dx<=200&&
                   x2-dy>=0&&x2-dy<=200&&
                   y2+dx>=0&&y2+dx<=200&&
                   book[x1-dy][y1+dx]==1&&
                   book[x2-dy][y2+dx]==1)
                {
                    sum++;
                }
            }
        }
        printf("%d\n",sum/4);
    }
    return 0;
}


<think>根据题目要求,我们需要实现一个正n边形的面积和周长计算。正n边形的面积公式为:(n*side^2)/(4*tan(π/n)),周长公式为:n*side。注意:这里需要使用Math类中的tan和PI,以及注意三角函数参数的单位(弧度制)。我们将实现RegularPolygon类,该类实现IShape接口,包含构造方法和两个接口方法。步骤:1.导入需要的包,如java.util.Scanner用于输入。2.定义IShape接口。3.定义RegularPolygon类实现IShape接口,并实现其方法。4.在main方法中读取输入,创建RegularPolygon对象,计算并输出面积和周长(保留两位小数)。注意:由于接口已经给出,我们可以直接使用。但题目要求从键盘输入,所以我们需要写一个main方法来处理输入和输出。然而,题目要求已经给出了接口和类的构造方法,因此我们按照要求编写即可。由于题目没有明确说明输出格式,按照惯例,我们输出保留两位小数。实现代码:</think> 根据题目要求,我们需要实现一个计算正n边形面积和周长的程序。以下是完整的解决方案: ```java import java.util.Scanner; import java.lang.Math; // 定义形状接口 interface IShape { double getArea(); double getPerimeter(); } // 正多边形实现类 class RegularPolygon implements IShape { private int n; // 边数 private double side; // 边长 // 构造函数 public RegularPolygon(int n, double side) { this.n = n; this.side = side; } @Override public double getArea() { // 面积公式: (n * side^2) / (4 * tan(π/n)) return (n * Math.pow(side, 2)) / (4 * Math.tan(Math.PI / n)); } @Override public double getPerimeter() { // 周长公式: n * side return n * side; } } // 主程序 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入正多边形的边数和边长 int n = scanner.nextInt(); double side = scanner.nextDouble(); // 创建正多边形对象 RegularPolygon polygon = new RegularPolygon(n, side); // 计算并输出结果(保留两位小数) System.out.printf("面积: %.2f\n", polygon.getArea()); System.out.printf("周长: %.2f\n", polygon.getPerimeter()); } } ``` ### 代码解释: 1. **IShape接口**: - 定义了形状的基本操作规范 - `getArea()`:计算面积 - `getPerimeter()`:计算周长 2. **RegularPolygon类**: - 实现`IShape`接口 - 构造函数:接收边数`n`和边长`side` - `getArea()`:使用正多边形面积公式 $(n \times side^2)/(4 \times tan(\pi/n))$ - `getPerimeter()`:使用周长公式 $n \times side$ - 利用`Math.tan()`和`Math.PI`进行三角函数计算 3. **Main类**: - 读取用户输入的边数和边长 - 创建`RegularPolygon`实例 - 调用接口方法计算面积和周长 - 使用`printf`格式化输出(保留两位小数) ### 关键公式: - **周长**:$周长 = n \times 边长$ - **面积**:$面积 = \frac{n \times 边长^2}{4 \times tan(\pi/n)}$ 该程序实现了完整的正多边形计算功能,符合面向对象设计原则,通过接口定义行为规范,通过具体类实现计算逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值