Hi Abousetta,
I'm making some headway - I figured that there would be just one offset between any two circles, and the way to nail it would be in the combinations - so here's a way to get the offsets:
Sub TestGO()
Call GetOff(1585, 927, 2031733) 'V1,V2=1298
Call GetOff(1585, 170, 40063) 'V1,V3=1578
Call GetOff(1585, 87, 12113) 'V1,V4=1583
Call GetOff(927, 170, 13359) 'V2,V3=913
Call GetOff(927, 87, 4790) 'V2,V4=923
Call GetOff(170, 87, 12113) 'V3,V4=147
End Sub
Function GetOff(R1 As Single, R2 As Single, A As Single) As Single
Dim WF As WorksheetFunction, T As Single, Pi As Single, X As Single
Set WF = WorksheetFunction: Pi = WF.Pi
For T = 0.01 To 2 * Pi Step 0.02
If Abs(R1 / R2 * Sin(T)) > 1 Then
GoTo GetNext: End If
X = (R1 ^ 2 * (T - Sin(T)) + R2 ^ 2 * WF.Asin(R1 / R2 * Sin(T)) - R1 * R2 * Sin(T))
If X >= 2 * A Then
Exit For: End If
GetNext: Next T
GetOff = Sqr(R1 ^ 2 * (1 - Sin(T) ^ 2) + Sqr(R2 ^ 2 - R1 ^ 2 * Sin(T) ^ 2))
End Function
Sub VennEm(): Dim s As Integer, i As Long, j As Long, Origin As Range
Dim R As Single, X As Single, Y As Single, OL As Single, OT As Single
Dim L As Single, T As Single, W As Single, H As Single
Set Origin = Range("J14"): OL = Origin.Left: OT = Origin.Top: s = 10
For i = 3 To 6
R = CSng(Range("C" & i) / s): X = CSng(Range("D" & i) / s): Y = CSng(Range("E" & i) / s)
L = OL + X - R: T = OT - Y - R: W = 2 * R: H = 2 * R
Call VC(L, T, W, H)
Next i
End Sub
Sub VC(L As Single, T As Single, W As Single, H As Single):
Dim O As MsoShapeType
Dim ws As Worksheet: Set ws = ActiveSheet: O = msoShapeOval
ws.Shapes.AddShape(O, L, T, W, H).Select
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Transparency = 0.73
End Sub
It's getting more correct
This is almost what it should look like:Abousetta1.jpg
Bookmarks