图形就必然会存在几何的数学问题:点的旋转,求交点。
1、求点A(a,b)旋转β弧度后B的坐标:
/**
* Returns a new transformed Point of the input Point based on the
* transformation values set.
*/
public Point getTransformed(Point p) {
double x = p.x;
double y = p.y;
double temp;
x *= scaleX;
y *= scaleY;
temp = x * cos - y * sin;
y = x * sin + y * cos;
x = temp;
return new Point(Math.round(x + dx), Math.round(y + dy));
}
a = cosα
b = sinα
x = cos(α + β) = cosα*cosβ - sinα*sinβ
y = sin(α + β) = sinα*cosβ + cosα*sinβ
=>
x = acosβ - bsinβ
y = bcosβ + asinβ
2、计算交点
(1)长方形外一点P以及长方形中心O,求PO的连线与长方形的交点:
/**
* Gets a Rectangle from {@link #getBox()} and returns the Point where a
* line from the center of the Rectangle to the Point <i>reference</i>
* intersects the Rectangle.
*/
public Point getLocation(Point reference) {
Rectangle r = Rectangle.SINGLETON;
r.setBounds(getBox());
r.translate(-1, -1);
r.resize(1, 1);
getOwner().translateToAbsolute(r);
float centerX = r.x + 0.5f * r.width;
float centerY = r.y + 0.5f * r.height;
if (r.isEmpty() || (reference.x == (int) centerX && reference.y == (int) centerY))
return new Point((int) centerX, (int) centerY); // This avoids divide-by-zero
float dx = reference.x - centerX;
float dy = reference.y - centerY;
// r.width, r.height, dx, and dy are guaranteed to be non-zero.
float scale = 0.5f / Math.max(Math.abs(dx) / r.width, Math.abs(dy) / r.height);
dx *= scale;
dy *= scale;
centerX += dx;
centerY += dy;
return new Point(Math.round(centerX), Math.round(centerY));
}
1> 判断象限(dx,dy的符号可以确定)
2> 与那条边相交:
float scale = 0.5f / Math.max(Math.abs(dx) / r.width, Math.abs(dy) / r.height);
根据比例算出大边!然后通过相似三角形进行计算。
(2) 椭圆外一点P以及椭圆中心O,求PO的连线与椭圆的交点:
/**
* Returns a point on the ellipse (defined by the owner's bounding box)
* where the connection should be anchored.
*/
public Point getLocation(Point reference) {
Rectangle r = Rectangle.SINGLETON;
r.setBounds(getOwner().getBounds());
r.translate(-1, -1);
r.resize(1, 1);
getOwner().translateToAbsolute(r);
// 相当于
// ref.x = reference.x - r.getCenter().x;
// ref.y = reference.y - r.getCenter().y;
Point ref = r.getCenter().negate().translate(reference);
if (ref.x == 0)
return new Point(reference.x, (ref.y > 0) ? r.bottom() : r.y);
if (ref.y == 0)
return new Point((ref.x > 0) ? r.right() : r.x, reference.y);
float dx = (ref.x > 0) ? 0.5f : -0.5f;
float dy = (ref.y > 0) ? 0.5f : -0.5f;
// ref.x, ref.y, r.width, r.height != 0 => safe to proceed
float k = (float) (ref.y * r.width) / (ref.x * r.height);
k = k * k;
return r.getCenter().translate((int) (r.width * dx / Math.sqrt(1 + k)),
(int) (r.height * dy / Math.sqrt(1 + 1 / k)));
}
1>计算角度θ;
2>通过椭圆的三角坐标代换算出坐标值。
- 大小: 16.5 KB
- 大小: 11.5 KB
- 大小: 20.3 KB
分享到:
相关推荐
- 位图是以像素点的形式存储图像,而矢量图是以数学公式描述图像。 - **操作位图**: - Java2D可以通过`BufferedImage`类来读取、修改和写入位图数据。 - 使用`Graphics2D`对象的`drawImage()`方法绘制位图。 #...
矢量图与位图不同,它不是由像素组成,而是由几何形状(如直线、曲线、多边形)和数学公式定义。因此,矢量图具有无限缩放而不失真的特性,非常适合制作图形用户界面、图表、图标等。 四、2D图形API 在C++中,我们...
- 简单物理:如重力、碰撞反弹,可以通过简单的数学公式实现。 - 物理引擎:如Farseer Physics Engine,提供更复杂的物理行为模拟。 9. **资源管理** - 资源池:高效地复用和释放资源,避免内存泄漏和性能问题。...
矢量绘图是一种基于数学公式和几何形状的图像创建方法,而非像素图像。因此,使用矢量绘图软件可以创建出分辨率独立、清晰度高、易于缩放和修改的图形。Vector Draw的源代码可能包含以下几个核心知识点: 1. **图形...
在本压缩包“draw3dRect.rar”中,包含了C#语言实现的3D长方体绘制示例代码。这个程序演示了如何在2D平面上通过透视变换来模拟3D效果,使得用户可以在屏幕上看到立体的3D矩形。由于无需引用额外的dll文件,这使得它...
1. **数学公式解析**:软件需要能够读取和解析数学表达式,这可能涉及到符号计算库的使用,如GSL(GNU Scientific Library)或自定义的解析算法。解析后的公式可以转化为可执行的代码,用于计算函数值。 2. **坐标...
实验的目的是加强对静电场场强、电容、电场能量的理解,应用静电场的边界条件建立模拟的静态电场,解决电容等计算问题,并提高学生抽象思维能力和利用数学工具解决实际问题的能力。 知识点1:Maxwell软件的基本操作...
它的优点在于,不仅能够生成清晰、高分辨率的PDF和EPS图像,而且能够与LaTeX的数学公式完美结合,允许在图形中直接插入数学符号和公式,这对于数学和物理等领域的研究人员来说极其便利。 使用TikZ或PGF进行绘图的...
9. **物理模拟**:虽然XNA本身不包含复杂的物理引擎,但可以通过简单的数学公式或引入第三方库(如Farseer Physics Engine)来实现基本的物理效果。 10. **内容管理**:ContentManager类是Content Pipeline的关键,...
3. **波浪函数**:波浪效果通常通过数学公式来实现,比如正弦函数或者余弦函数。我们可以定义一个函数,参数为x坐标,返回值为y坐标上的波动值。将这个函数应用到每个字符的y坐标上,就能得到波浪效果的文字。 4. *...
对于更高级的应用,还可以结合数学公式,如心形曲线(Cardioid),来创建更为复杂的图形。 如果你正在学习编程或图形设计,理解这些基本概念将有助于你创建自己的心形图案或其他任何形状。无论是在网页设计、游戏...
这涉及到数学计算,如圆的方程、距离公式以及时间相关的动画计算。 ```javascript function draw() { // 清除画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 更新并绘制每个波纹 waves.forEach(...
在这个函数中,我们可以使用GDI的绘图函数结合数学公式来绘制任意形状和图像。 在"图形处理"方面,MFC还提供了对位图、图标和其他图像资源的支持。我们可以通过LoadBitmap、LoadCursor等函数加载图像资源,然后使用...
波浪是由水面上下振动形成的,这种运动可以用数学公式来模拟,如正弦或余弦函数。在iOS开发中,我们可以利用Core Animation框架来实现基于这些函数的视图动画。Core Animation是苹果提供的一套强大的2D图形渲染和...
11. **Word数学公式**:在Word中可以通过“插入”->“对象”或“公式”按钮插入数学公式。 12. **软件维护**:软件交付后需要持续维护,以修复错误、改进性能和添加新功能。 13. **查询和视图输出**:视图和查询...
在Java中,我们可以利用数学公式来直接计算抛物线上的点,或者通过迭代方法来逼近抛物线的形状。以下我们将介绍两种不同的方法。 ### 实例1:基于二次方程的抛物线绘制 这个实例将展示如何使用Java的`java.awt`和`...
极坐标系统中,(r, θ)表示一个点到原点的距离和角度,我们将心形的形状通过数学公式表达出来: ```python def draw_heart(): t = np.linspace(0, 2*np.pi, 500) r1 = (np.sin(t)**3) r2 = 0.7 * np.cos(t) + ...
烟花的运动轨迹可以模拟为抛物线,我们可以使用数学公式来计算其上升和下落的速度。例如: ```python class Firework: def __init__(self, start_position, color): self.position = start_position self.color ...
Bezier曲线是一种在计算机图形学中广泛应用的数学工具,主要用于创建平滑的曲线路径。在Java编程语言中,实现Bezier曲线的代码通常涉及到一系列数学运算,包括向量、矩阵和插值算法。以下是对Bezier曲线及其Java实现...
开发者通常会使用数学公式或者随机算法来控制粒子的运动方向和速度。 3. **碰撞检测(Collision Detection)**:为了使粒子之间或粒子与边界有交互,需要进行碰撞检测。这可能涉及到复杂的计算,例如使用距离公式检测...