509 words
3 minutes
在直角坐标系中旋转检测版
最近遇到一个需求,需要在检测版测试中将检测版旋转一定角度,来避免射线方向的Smearing。
定义研究区域和网格点
首先定义研究区域范围为x方向,y方向, 间隔为,并生成网格点坐标为xgrid
和ygrid
import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import RegularGridInterpolator
xmin, xmax = 0, 1000ymin, ymax = 0, 800x0 = (xmin+xmax)/2y0 = (ymin+ymax)/2dx = 12dy = 12x = np.arange(xmin, xmax, dx)y = np.arange(ymin, ymax, dy)ygrid, xgrid = np.meshgrid(y, x, indexing='ij')
网格点坐标旋转
我们以在原坐标中定义了规则网格即xgrid
和ygrid
,选择中心位置(也可以是任意位置)和角度,进行坐标旋转,获得新的坐标系中对应点的坐标:
代码如下
def rotate(x, y, x0, y0, theta): x1grid = np.zeros([y.size, x.size]) y1grid = np.zeros([y.size, x.size]) rad = np.deg2rad(theta) rotmat = np.array([[np.cos(rad), np.sin(rad)], [-np.sin(rad), np.cos(rad)]]) for i, xx in enumerate(x): for j, yy in enumerate(y): x1grid[j, i], y1grid[j, i] = rotmat @ np.array([xx-x0, yy-y0]) return x1grid, y1grid
这里定义,并绘制出坐标旋转后新坐标系下对应的坐标
theta=60x1grid, y1grid = rotate(x, y, x0, y0, theta)plt.scatter(x1grid, y1grid, s=2, color='C1')
在新坐标系中设置检测版
我们在新坐标系下x方向和y方向范围内设置检测版,其中x方向设置6个异常体,y方向设置7个异常体,异常大小为12%
x_lim_cb = [-500, 500]y_lim_cb = [-600, 600]hx = 2hz = 2x_cb = np.arange(*x_lim_cb, hx)x_pert = np.zeros_like(x_cb)y_cb = np.arange(*y_lim_cb, hx)y_pert = np.zeros_like(y_cb)pert=0.12num_per_x = 6num_per_y = 7x_pert = np.sin(num_per_x*np.pi*np.arange(x_cb.size)/x_cb.size)y_pert = np.sin(num_per_y*np.pi*np.arange(y_cb.size)/y_cb.size)yy, xx = np.meshgrid(y_pert, x_pert, indexing='ij')xy_pert = xx*yy*pert
plt.pcolor(x_cb, y_cb, xy_pert)plt.gca().set_aspect('equal')
二维插值获得旋转后的检测版
我们用在xy_pert
中插值,即可获得原坐标 中每个点对应的异常体大小。
interp = RegularGridInterpolator((y_cb, x_cb), xy_pert, bounds_error=False, fill_value=0.)xy_pert_inter = interp(( y1grid, x1grid))plt.pcolor(xgrid, ygrid, xy_pert_inter)plt.gca().set_aspect('equal')
在直角坐标系中旋转检测版
https://fuwari.vercel.app/posts/rot_checker/