SSL_2432 最大面积

本文介绍了一种通过枚举和几何计算求解阴影面积的方法。给定圆的半径r,通过枚举两个内接矩形的宽度a和b,计算它们的长度,并找出最大阴影面积对应的a和b值。

题意

思路

这里写图片描述看这个图,我们已经知道了rr,然后枚举abb,可以知道宽度为a的那个长方形的长为r2a222,宽度为b的那个长方形的长为r2b222r2−b22∗2,那么这个阴影面积为这两个长方形减去中间重合的一个长方形就好了,枚举最大的阴影面积然后保留a和b。

代码

#include<cstdio>
#include<cmath>
using namespace std;
int r,a,b;
double ans,ta,tb;
int main()
{
    scanf("%d",&r);
    for (int i=1;i<2*r;i++)
        for (int j=1;j<2*r;j++)
        {
            ta=(double)sqrt(r*r-(i/2.0)*(i/2.0))*2*i;//一个长方形的长
            tb=(double)sqrt(r*r-(j/2.0)*(j/2.0))*2*j;//另一个长方形的长
            if (ta+tb-i*j>ans)//如果阴影面积大于之前答案我们就替换
            {
                ans=ta+tb-i*j;
                a=i;
                b=j;
            }
        }
    printf("%d\n%d",a,b);
}
<think> 我们逐行分析给定的代码: 1. `import osmnx as ox` - 导入osmnx库,并简称为ox。osmnx是一个用于从OpenStreetMap获取、构建、分析和可视化街道网络的Python库。 2. `#ox.settings.timeout = 600` 和 `#ox.settings.max_retries = 3` 以及 `#ox.settings.overpass_url = "https://overpass-api.de/api/interpreter"` - 这些是注释掉的设置,分别表示设置超时时间(600秒)、最大重试次数(3次)和Overpass API的URL。当前未启用。 3. `import requests` - 导入requests库,用于发送HTTP请求。 4. `ox.settings.requests_kwargs={"verify":False}` - 设置osmnx的requests请求参数,这里设置`verify=False`表示在发送HTTPS请求时不验证SSL证书。这通常用于解决某些SSL证书验证问题,但会降低安全性。 5. `wsg84 = pyproj.CRS("epsg:4326")` - 创建一个WGS84地理坐标系(EPSG:4326)的坐标参考系统(CRS)对象。WGS84是常用的经纬度坐标系。 6. `lambert = pyproj.CRS("epsg:4326")` - 这里将lambert同样设置为EPSG:4326,即与wsg84相同。注意,通常Lambert投影会使用其他投影坐标系(如EPSG:26915),这里可能是个错误或者临时设置。 7. `transformer = pyproj.Transformer.from_crs(wsg84, lambert, always_xy=True)` - 创建一个坐标转换器,从wsg84坐标系(源CRS)转换到lambert坐标系(目标CRS)。由于两者都是EPSG:4326,所以这个转换实际上是恒等转换(即不转换)。`always_xy=True`确保输入和输出的坐标顺序是(x, y)(即经度, 纬度)。 8. `coords = [transformer.transform(x, y) for x, y in dc.last_draw['geometry']['coordinates'][0]]` - 使用上面创建的转换器,将dc.last_draw(可能是某个绘图对象)中最后一个绘制的几何图形的坐标(取第一个环,即外环)进行转换。由于转换器是恒等转换,所以实际上坐标不变。转换后的坐标存入列表coords。 9. `osm_polygon = shapely.geometry.Polygon(coords)` - 使用转换后的坐标(即原始经纬度坐标)创建一个Shapely的多边形对象osm_polygon。 10. `# Query the OpenStreetMap data` - 注释,表示接下来要查询OpenStreetMap数据。 11. `# buildings = ox.geometries.geometries_from_polygon(osm_polygon, tags={'building': True})` - 注释掉的旧版API调用方式。使用osmnx的geometries_from_polygon方法,根据多边形区域和标签(这里查询建筑物)获取地理要素。 12. `buildings = ox.features.features_from_polygon(osm_polygon, tags={'building': True})` - 使用osmnx的features_from_polygon方法(新版API)获取多边形区域内所有带有标签'building'为True的要素(建筑物)。返回一个GeoDataFrame。 13. `# Filter buildings that intersect with the polygon` - 注释,表示接下来要过滤与多边形相交的建筑物。 14. `filtered_buildings = buildings[buildings.intersects(osm_polygon)]` - 从buildings中筛选出与osm_polygon(即用户绘制的多边形)相交的建筑物。注意,这里使用`intersects`方法,意味着只要建筑物与多边形有交集(包括部分相交)就会被选中。 注意:在步骤6中,目标CRS设置为4326,这样转换器实际上没有进行任何坐标变换。如果目的是将经纬度转换为投影坐标(如米制单位),则应该将lambert设置为一个投影坐标系(如EPSG:26915)。当前设置可能是错误的,或者用户绘制的多边形坐标已经是经纬度,且后续操作不需要投影变换。 §§相关问题§§ 1. 为什么在创建坐标转换器时,源CRS和目标CRS都使用了相同的EPSG:4326?这会导致什么问题? 2. 在查询OpenStreetMap建筑物数据时,使用`features_from_polygon`和`geometries_from_polygon`有何区别? 3. 设置`ox.settings.requests_kwargs={"verify":False}`会带来什么安全风险?在什么情况下必须使用? 4. 在过滤建筑物时,使用`intersects`方法可能会包含哪些边界情况?是否有必要使用`within`方法? 5. 如果用户绘制的多边形跨越了多个投影带,使用UTM投影(如EPSG:26915)会遇到什么问题?如何解决? </think> ### 逐行代码分析 ```python import osmnx as ox # 导入OSMnx库,用于处理OpenStreetMap数据 ``` - OSMnx是专门处理OpenStreetMap地理数据的Python库 - 提供获取、分析和可视化街道网络及建筑数据的功能 ```python #ox.settings.timeout = 600 #ox.settings.max_retries = 3 #ox.settings.overpass_url = "https://overpass-api.de/api/interpreter" ``` - 注释掉的配置项(默认不生效): - `timeout=600`:设置API请求超时时间为600秒 - `max_retries=3`:设置失败重试次数 - `overpass_url`:指定Overpass API端点(默认为官方服务器) ```python import requests # 导入HTTP请求库 ox.settings.requests_kwargs={"verify":False} # 禁用SSL证书验证 ``` - 配置OSMnx使用requests库时跳过SSL验证 - 解决某些环境下证书验证失败问题 - **安全警告**:生产环境应避免禁用证书验证 ```python wsg84 = pyproj.CRS("epsg:4326") # WGS84坐标系(经纬度) lambert = pyproj.CRS("epsg:4326") # 目标坐标系(此处与源坐标系相同) ``` - 定义两个相同的坐标系(EPSG:4326) - **关键问题**:目标坐标系应使用投影坐标系(如EPSG:26915)而非地理坐标系 ```python transformer = pyproj.Transformer.from_crs(wsg84, lambert, always_xy=True) # 创建转换器 ``` - 创建坐标系转换器(实际为恒等转换) - `always_xy=True`确保坐标顺序为(经度, 纬度) ```python coords = [transformer.transform(x, y) for x, y in dc.last_draw['geometry']['coordinates'][0]] # 转换坐标 ``` - 遍历用户绘制多边形的顶点 - 执行坐标转换(实际未变换) - `dc.last_draw['geometry']['coordinates'][0]`获取GeoJSON格式的外环坐标 ```python osm_polygon = shapely.geometry.Polygon(coords) # 创建Shapely多边形 ``` - 使用转换后的坐标构建多边形对象 - 该多边形将作为OSM数据查询范围 ```python # Query the OpenStreetMap data # buildings = ox.geometries.geometries_from_polygon(osm_polygon, tags={'building': True}) ``` - 注释掉的旧版API调用方式(ox.geometries) - 按'building'标签查询多边形区域内所有建筑 ```python buildings = ox.features.features_from_polygon(osm_polygon, tags={'building': True}) # 新版API查询 ``` - 使用新版OSMnx API查询建筑数据 - `tags={'building': True}`筛选具有建筑标签的要素 - 返回GeoDataFrame包含所有建筑几何信息 ```python # Filter buildings that intersect with the polygon filtered_buildings = buildings[buildings.intersects(osm_polygon)] # 空间关系过滤 ``` - 筛选与查询多边形相交的建筑 - `intersects()`方法保留所有与多边形有交集的建筑(包括部分包含) - **注意**:此处过滤可能冗余,因查询已限定在区域内 ### 主要问题分析 1. **坐标系问题**: - 源和目标坐标系相同(EPSG:4326) - 未进行投影变换 → 坐标仍为经纬度 - 导致后续距离/面积计算不准确 2. **数据过滤冗余**: - `features_from_polygon`已返回区域内要素 - `intersects`过滤通常不必要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值