给出维恩图的源数据,例如A=10, B=15, C=12, A+B=5, B+C=3, A+C=2, A+B+C=1
,我需要绘制一个维恩图,其圆的大小与A,B和C成正比,并且它们的重叠与A + B,B + C和A + C成正比。该图不必与数据完全匹配,而应尽可能接近(我更喜欢简单的计算方法)。它必须正确地表示没有重叠的情况,并且一个集合是另一集合的适当子集。对于给定的画布大小(宽度/高度),我将如何计算正确的圆的位置和半径。我能够找到two-circle Venn的数学。有人做过3圈计算吗?
P.S。上面的示例数字是随机的,可能无效。
答案 0 :(得分:1)
圆A, B
之间的距离必须是交集面积等于(A+B) + (A+B+C)
的两圆 Venn问题的解决方案(如果简单地将(A+B)
您的定义包括(A+B+C)
)。同样,对于B, C
,交集为(B+C) + (A+B+C)
,对于C, A
同样。
使用找到的算法独立解决这些问题,您将获得 3个距离,该距离等于连接三个圆心的三角形的边长。通过一些高中三角函数,构造三角形并由此绘制圆是一项容易的任务。
解决方案是唯一的,并且只有在相交值本身有效时才有效。
答案 1 :(得分:1)
由3个圆的维恩图定义的区域有8个。如果我们将集合A定义为包含1到1的二进制数字0到7,将B设为2到1的二进制数字,将C设为4到1的二进制数字,则得到
A = {1, 3, 5, 7}; B = {2, 3, 6, 7}; C = {4, 5, 6, 7}
这些数字中的每个数字都定义了图中的一个区域,0
代表圆圈之外和通用集内部的区域:即A' ∩ B' ∩ C'
。
您知道如何解决2圈问题。因此,请解决A和B(使用A
,B
和A ∩ B
的大小),B和C以及A和C的问题,从而得出圆心和圆的大小。使用这三个距离为这些圆心绘制一个三角形,然后在这些圆心周围绘制圆。如果这样会使外部区域0
的尺寸错误,则可以缩小或扩展整个3圆的设置以使其正确。
这使所有区域正确-除区域7
(所有三个集合的交集)之外。该大小将由其他所有大小设置-您在这里别无选择。因此,它可能不会具有您想要的大小。您将需要进行实验,以查看该区域的大小通常是否足够接近所需大小。我的简要研究表明,没有办法在图表中使用圆并始终获取所有八个区域的大小。如果您改用椭圆形或其他更通用的形状,则应该可以,但是您似乎想要圆圈。
请注意,如果正确解决了2圆问题,则将自动处理不相交圆和子圆的情况。例如,如果A和B不相交,则区域3和7为空,您的解决方案将使两个圆圈不重叠。如果您使用链接站点中显而易见的算法,但它们不会重叠,它们可能会碰触到。同样,如果一组是另一组的子集,则一个圆将位于另一个圆的内部,尽管它们可能会接触。如果您不想触摸,那么避免这种情况的算法应该很容易,除非您当然会遇到三组中的两组相等的情况。