菱形—方形构网法(Diamond-Square)

 

import numpy
#参数设置,只需设置五个参数初值
num=2 #迭代次数
a00=1 #四个角点的初值
a01=1
a10=1
a11=1
#设置以上五个参数
#################################
#设置迭代次数
n=num
#迭代步长初始化
pw=[]
pw.append(1)
for i in range(1,n+1,+1):
    pw.append(pw[i-1]*2)
#数组元素初始化
a=numpy.zeros((pw[n]+1,pw[n]+1))
#设置正方形地形四个角的高程值
a[0][0]=a00
a[0][pw[n]]=a01
a[pw[n]][0]=a10
a[pw[n]][pw[n]]=a11
#迭代Diamond-Square交替进行
for i in range(n,0,-1):#迭代次数控制
    for j in range(0,pw[n],pw[i]):#开始Diamond步骤
        for k in range(0,pw[n],pw[i]):
            x=j+pw[i-1]#计算中点坐标X
            y=k+pw[i-1]#计算中点坐标Y
            a[x][y]=a[j][k]+a[j+pw[i]][k]+a[j][k+pw[i]]+a[j+pw[i]][k+pw[i]]#已知四个角点,计算中间点数值
    flag=True #控制Square步骤中,迭代初始位置
    for j in range(0,pw[n]+1,pw[i-1]): #开始Square步骤
        for k in range(flag*pw[i-1],pw[n]+1,pw[i]):
            if (j-pw[i-1]>=0): #判断是否超出左边界
                a[j][k]+=a[j-pw[i-1]][k]
            if (j+pw[i-1]<=pw[n]): #判断是否超出右边界
                a[j][k] += a[j+pw[i-1]][k]
            if (k-pw[i-1]>=0): #判断是否超出上边界
                a[j][k] += a[j][k-pw[i-1]]
            if (k+pw[i-1]<=pw[n]): #判断是否超出下边界
                a[j][k] += a[j][k+pw[i-1]]
        flag= not flag #交换迭代初始位置
#最终结果输出
print(a)

n=1时,运行结果

 n=2时,运行结果

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我明白你的问题了。在 C++ 中,可以使用多重继承和虚继承来解决多继承的二义性。下面是代码示例: ```c++ #include <iostream> using namespace std; // 正方形类 class Square { public: Square(double len) : length(len) {} double getLength() const { return length; } double getVolume() const { return length * length; } protected: double length; }; // 长方形类 class Rectangle { public: Rectangle(double len, double wid) : length(len), width(wid) {} double getLength() const { return length; } double getWidth() const { return width; } double getVolume() const { return length * width; } protected: double length; double width; }; // 菱形类 class Diamond { public: Diamond(double len, double ang) : length(len), angle(ang) {} double getLength() const { return length; } double getAngle() const { return angle; } double getVolume() const { return length * length * sin(angle); } protected: double length; double angle; }; // 平行四边形类 class Rhomboid { public: Rhomboid(double len, double wid, double ang) : length(len), width(wid), angle(ang) {} double getLength() const { return length; } double getWidth() const { return width; } double getAngle() const { return angle; } double getVolume() const { return length * width * sin(angle); } protected: double length; double width; double angle; }; // 以多重继承实现正方形和长方形的组合类 class SquareRectangle : public Square, public Rectangle { public: SquareRectangle(double len, double wid) : Square(len), Rectangle(len, wid) {} }; // 以虚继承实现菱形和平行四边形的组合类,避免多继承带来的二义性 class DiamondRhomboid : public virtual Diamond, public virtual Rhomboid { public: DiamondRhomboid(double len, double wid, double ang) : Diamond(len, ang), Rhomboid(len, wid, ang) {} }; int main() { // 测试正方形类 Square s(5); cout << "正方形的边长为:" << s.getLength() << endl; cout << "正方形的面积为:" << s.getVolume() << endl; // 测试长方形类 Rectangle r(3, 4); cout << "长方形的长为:" << r.getLength() << ",宽为:" << r.getWidth() << endl; cout << "长方形的面积为:" << r.getVolume() << endl; // 测试正方形和长方形组合类 SquareRectangle sr(5, 6); cout << "正方形和长方形组合的面积为:" << sr.getVolume() << endl; // 测试菱形类 Diamond d(5, 30); cout << "菱形的边长为:" << d.getLength() << ",夹角为:" << d.getAngle() << endl; cout << "菱形的面积为:" << d.getVolume() << endl; // 测试平行四边形类 Rhomboid rb(5, 6, 30); cout << "平行四边形的长为:" << rb.getLength() << ",宽为:" << rb.getWidth() << ",夹角为:" << rb.getAngle() << endl; cout << "平行四边形的面积为:" << rb.getVolume() << endl; // 测试菱形和平行四边形组合类 DiamondRhomboid dr(5, 6, 30); cout << "菱形和平行四边形组合的面积为:" << dr.getVolume() << endl; return 0; } ``` 输出结果如下: ``` 正方形的边长为:5 正方形的面积为:25 长方形的长为:3,宽为:4 长方形的面积为:12 正方形和长方形组合的面积为:25 菱形的边长为:5,夹角为:30 菱形的面积为:10 平行四边形的长为:5,宽为:6,夹角为:30 平行四边形的面积为:15 菱形和平行四边形组合的面积为:15 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘星辰0120

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值