我们知道2个圆的x和y中心位置,半径是相同的。我想直观地连接圆,而不是为连接2个圆中心的直线上的每个点循环绘制椭圆。
由此:
的数据
对此:
的
代码:
int radius = 75;
int x1 = 100;
int y1 = 200;
int x2 = 300;
int y2 = 100;
g.FillEllipse(Brushes.Blue, new Rectangle(x1 - radius / 2, y1 - radius / 2, radius, radius));
g.FillEllipse(Brushes.Blue, new Rectangle(x2 - radius / 2, y2 - radius / 2, radius, radius));
字符串
3条答案
按热度按时间41zrol4v1#
一个解决方案,当圆不具有相同的直径。
第一个需要的信息是两个圆的中心之间的距离。
为了计算它,我们使用应用于笛卡尔平面的Euclidean distance:
x1c 0d1x的数据
其中
(x1, y1)
和(x2, y2)
是两个圆的圆心的坐标。我们还需要知道方向(表示为正值或负值):计算出的
[Distance]
将始终为正值。在
C#
it中,它可以被编码为:字符串
现在,我们有两个圆的中心之间的距离,它也表示方向。
我们还需要知道这条连接两个圆心的虚拟直线是如何相对于我们的绘图平面旋转的。在下图中,距离可以被看作是right triangle
h = (A, B)
的交叉使用。C
Angular 由平行于轴的直线的交点确定,这些直线穿过圆心。我们需要计算Angular θ
(θ)
。使用Pythagorean theorem,我们可以推导出Angular θ的正弦为
Sinθ = b/h
(如图所示)使用圆的中心坐标,这可以在
C#
中编码为:(
Distance
是三角形的长度)型
SinTheta
表示Radians
中的Angular 。我们需要Degrees
中表示的Angular :Graphics
对象使用此度量作为其世界变换函数。型
现在,我们需要构建一个 Connector,一个连接两个Circles的形状。我们需要一个Polygon;一个Rectangle不能有不同的边对(我们考虑的是直径不同的Circles)。
此多边形的长边=圆中心之间的距离,短边=圆直径。
要构建多边形,我们可以使用Graphics.DrawPolygon和GraphicsPath.AddPolygon。我选择
GraphicsPath
方法,因为GraphicsPath
可以容纳多个形状,并且这些形状可以在某种程度上相互作用。要将2个考虑的圆与多边形连接起来,我们需要使用之前计算的
RotationAngle
旋转多边形。执行旋转的一个简单方法是使用Graphics.TranslateTransform方法将世界坐标移动到其中一个圆的中心,然后使用Graphics.RotateTransform旋转新坐标。
我们需要绘制多边形,将其中一条短边(对应于圆的直径,即坐标变换的中心)定位在圆的中心。因此,当应用旋转时,它的短边将位于此变换的中间,锚定到中心。
这里,
figure 3
显示了多边形的位置(黄色形状)(好吧,它看起来像一个矩形,没关系);在
figure 4
中旋转后的同一多边形。的
备注:
正如TaW指出的那样,这个绘图需要使用具有非透明颜色的SolidBrush来执行,这有点令人失望。
好吧,半透明的画笔是不禁止的,但重叠的形状将有不同的颜色,交叉点的透明颜色的总和。
然而,使用
GraphicsPath
的能力,使用应用于所有重叠部分的颜色来填充其形状,可以使用半透明的Brush绘制形状,而无需更改颜色。我们只需要更改默认值FillMode(请参见图中的示例),将其设置为FillMode.Winding
。示例代码:
在这个例子中,两对圆被绘制在图形上下文中。然后它们被连接到一个多边形形状,使用
GraphicsPath.AddPolygon()
创建。(Of当然,我们需要使用可绘制控件的
Paint
事件,这里是一个窗体)。重载的helper函数接受Circles的中心位置,表示为
PointF
和RectangleF
结构,表示Circles边界。这是使用全色和半透明画笔的视觉结果:
型
辅助函数:
型
ogsagwnx2#
由于到目前为止的其他答案稍微错过了正确的解决方案,这里有一个连接两个相等大小的圆:
字符串
x1c 0d1x的数据
备注:
GraphicsPath
来填充,如果颜色的alpha < 1。ne5o7dgx3#
伪风格:
字符串
重复midx midy,在两个方向上。添加另一个圆。老实说,伙计,这不值得,为了使它平滑,你需要几个圆。你需要用两个圆的中心作为椭圆的两个中心来画一个椭圆。