Twenty-six years ago when I started managing money I thought the business was all about returns. Boy, was I ever wrong. With the benefit of a lot of experience and the things learned from more than a few mistakes, I now understand that being an effective wealth management firm requires us to be managers of much more than money. We also need to understand our clients' behaviour, emotions and expectations, and we need to help them form and realize long term financial plans.
Everyone who is interested in the investment industry has read an awful lot about computer-driven investing and so-called robo-advisors. I have no doubt that there are some brilliant software engineers out there who can design very sophisticated algorithms that can, in turn, allocate assets and direct buys and sells. Maybe some of them can even do it better than humans. But we also understand what robots cannot do.
During the 2008/09 stock market crash, for about seven months my partners and I were on the phone with clients, in meetings with them, or were busy answering their emails literally around the clock. I vividly remember sitting with clients, in their homes or our offices, who were almost speechless with fear that they would lose their life savings. Many or our clients wanted us to liquidate their portfolios. Many vowed never to go near the stock market again. We held their hands, both literally and figuratively and looked into their eyes. We told them that selling would be the wrong thing to do, in fact, it would be a disaster. In the end about 97% of our clients took our advice. A mere handful did not. But here's the point: our connection with them was 100% human, based on their trust that we understood them, understood what we were doing with their money, and that together we could weather the storm. Robots cannot look you in the eye; they cannot hold your hand; and they will never understand you like another human can.
Many of our relationships with clients and their families stretch over years and even decades. Recently one of our long-time clients called us with the horrible news of a diagnosis of terminal cancer. He was more concerned about his business, about his wife and about his daughter than he was about himself. He needed immediate help to get his affairs in order for the best possible transition. He was unable to travel from out of town to see us. One of our portfolio associates visited him at this home, met with his wife and daughter, explained each document we had prepared, and took the time to ensure that every level of comfort possible was provided. We did our best to make an awful situation slightly less bad. I know that robots don't make house calls, and I also know that none has yet been invented that has a human heart.
We know that as we move forward with our clients, many of whom are making the transition from working to retirement, we will be spending more and more time on the "soft" side of wealth management, the financial planning and strategic thinking that will ensure that they have the retirement they desire. Each of our client families has things that make them unique, and which require us to use all of our accumulated experience and knowledge to find solutions for them, one by one by one. A computer-driven financial plan would be easier and likely cheaper; but it would not do justice to their needs. Computers are great tools, and absolutely essential to our business. But they are just that, tools, and not human beings. We are convinced that they are not ready to replace us.


text:
rob@bengeho.com
Bengeho Limited was founded as a private equity investment company by Robert Hurst in May 2019.
Prior to founding Bengeho, Robert co-founded the technology enabled music company Audio Network where he led the global growth of the group resulting in the sale to Entertainment One Group in April 2019 for $215 million.
Dawn Roskilly joined the Bengeho board in September 2019 bringing her skills and experience as a project manager.
"Bengeho" was the old english name used for the village of Bengeo which is today a suburb of the town of Hertford in Hertfordshire, England and where both Robert and Dawn spent their childhood years.
Investments: About
Bengeho is currently managing £20 million of private capital invested in sustainable growth equity and fixed income as well as private and public equity.
We partner with exceptional entrepreneurs and management teams with already proven sustainable business models with the ability to deliver further sustainable growth opportunities.
Our target investment range is £100,000 to £1 million per investment.
We are comfortable investing for minority or majority positions in companies with excellent management teams.
Bengeho does not invest in start-ups or very early stage companies.
About our Charitable Projects
Bengeho is working with Robert Hurst and The Robert Hurst Charitable Trust to fund charitable projects in Cambodia
Recent projects include sponsoring children to attend an international school and donating 12 tons of rice to help feed 245 families
Get Connected: Entrepreneurship
Robert Hurst, Founder of Bengeho and Audio Network and an alumni of the University of Bath Business School, will be on the panel of this Get Connected Event.
Get Connected is an ongoing events series run by the Alumni Relations Team at the University of Bath.
The series aims to engage with young alumni and current University of Bath students, providing them with direct access to graduates who have gone on to achieve success in their chosen industry.
Bengeho Limited
Private Equity Investment Company
Dawn Roskilly
Registered in England : Company number 12023572
Legal Entity Identifier (LEI) number : 213800KKZD2RJZAI3O19
Investments: Welcome
Investments: Contact
©2020 by Bengeho Limited. Proudly created with Wix.com

redpajama_set_name: RedPajamaCommonCrawl


text:
Comedy To Watch
An online magazine packed with reviews, news, articles and interviews about all things comedy old and new.
May 13, 2019 June 4, 2019 Alex Finch
NextUp Review: D.J. Demers – [Indistinct Chatter]
Because I'm something of a comedy snob I have to confess to having doubts as to whether I'd like D.J. Demers set, if only because he was a contestant on America's Got Talent. I'm pleased that yet a-bloody-gain I was completely wrong for thinking this, as it isn't predictable gags or obvious crowd pleasing material that you sometimes get from comedians who appear on such shows but a truly fun hour of stand up from a man who's great at what he does.
After a brief opening where he plays with the audience a little, dedicating the set to his brother Michael by pointing up in the air mournfully, before revealing he's doing so because Michael's a pilot, he gets big laughs from the get go before announcing that Michael is dead too, and died what he loved doing, killing hundreds of people. It's a strong opening and shows that Demer's has a great talent for unpredictable punchlines, and also that he's a very confident, assured performer.
A large section of the set is devoted to the fact that he's deaf, though he can hear to a certain extent thanks to hearing aids. Out of this subject he comes up with a good deal of impressive material, from the advantages of having poor hearing to the fact that he often misunderstands films, and that he can't understand whispering, with the best part of it revolving around how he doesn't enjoy hearing tests as he know's he's going to fail – he has a unique take on his condition and all of it made me laugh a lot. He also has a fun bit where he toys with the audience over his sexuality after mentioning that he and his partner have broken up and as there was no reaction the audience was clearly "Trying to solve the mystery", it's a section he generates a lot of strong laughs out of before eventually revealing he is straight. Carrying on about sexuality he discusses moving to America and how insane it is that gay men weren't allowed to give blood until recently, and that even then they're now only able to do so if they've not had sex for a year, which leads to another laugh out loud moment.
In the mid section the quality declines a little, it's still very likeable but it's not as strong as his opening twenty five minutes is, but he still has a fair bit of decent material about how he hates nightclubs due to not being able to hear people talk, and how his friends screw around with him by saying things like "This is D.J,, he loves having sex with dead people" and because he has no idea what they actually said he just agrees with them and hopes for the best. There's also an amusing if not particularly astonishing bit on the embarrassment of choking to death, and a routine about sitting on toilets which again made me smile a fair deal and laugh a couple of times, but it wasn't quite as good as the material earlier in the special. This is only a very minor complaint though, and it's of course rare that any stand up set is hit after hit, and the final fifteen minutes is a real return to form as he discusses his dislike of airplane travel and his confusion over why everyone isn't given a parachute, before ending on a story about past performances on a cruise ship that has a fantastic pay off and brings the show to a close.
It's not the most unconventional stand up you'll ever hear, it won't outrage or shock or make you reconsider your political beliefs, but it is an extremely strong set with a lot of intriguing takes on subjects which aren't covered that often in stand up, his material on being deaf is especially funny and it's where he really shines, but there isn't a weak note within the whole set. So if you like stand up which you can rely upon to make you laugh regularly, and aren't an idiot like I was when it comes to comedians who've appeared on talent shows, you'll really enjoy D.J. Demers' comedy.
Alex Finch.
Follow Comedy To Watch on Twitter – Contact Us – Write For Us – Site Map.
NextUp.
D.J. Demers' Official Site.
Stand Up Special Reviews
D.J. Demers
Stand Up Comedian
Stand Up Special Review
[Indistinct Chatter]
Previous Tv Review: My Dad Wrote A Porno HBO Special
Next One And Done: London Shouting
Regular Features:
Comedy Snippets – Short reviews of tv and film comedy, updated every Sunday.
Coming Attractions – All of the latest tv news from across the world, updated every Friday.
Currently Airing – Our guide to this week's best tv comedy in the UK & US.
The Free Online Stand Up / Theatre Comedy Guide – A selection of links to full shows that are free to view.
Gig Watch – Details of outdoor gigs and rescheduled tours.
Almost Forgotten
Comedy Comics
Comedy Oddities
Comedy Snippets
Essential Episodes
One And Not Done
Online Video Reviews
Taken Too Soon
The Re-Evaluation Game


text:
Q: $\pi_0(SO(N))$ and $\pi_0(O(N))$: Inconsistency between Bott periodicity and basic understanding of $\pi_0$ I need to know the homotopy groups of the oriented Grassmannian $\widetilde{Gr}(\infty,\infty) \cong \lim_{N \rightarrow \infty} SO(2N)/(SO(N) \times SO(N))$, and I've run into an inconsistency. It seems that the problem eventually reduces to finding the homotopy groups of the stable special orthogonal group $SO$. One can do this by exploiting Bott periodicity. I haven't found much about Bott periodicity specifically for $SO(N)$, but it's easy to find for $O(N)$: $$\pi_k(O(N)) = \begin{cases} \mathbb{Z}_2 & k = 0,1 \mod 8 \\ \mathbb{Z} & k = 3,7 \mod 8 \\ 0 & k = 2,4,5,6 \mod 8 \end{cases}$$ Since $\pi_k(SO(N)) = \pi_k(O(N))$, this gives us all the homotopy groups for $SO$.
The problem is that this tells us that for sufficiently high $N$ (i.e., $N \ge k+2$), $\pi_0(SO(N)) = \pi_0(O(N)) = \mathbb{Z}_2$. $\pi_0$ counts the path-connected components of a space, and while $O(N)$ does indeed have two of them, $SO(N)$ has only one, so $\pi_0(SO(N))$ should be $0$, not $\mathbb{Z}_2$. Therefore, something is wrong with the result from Bott periodicity.
Which of these arguments is wrong, and why?

A: The equality $\pi_kSO(n)=\pi_kO(n)$ is only true for $k>0$.
In fact $SO(n)$ is one of the two connected components of $O(n)$, so $\pi_0SO(n)=0$.

redpajama_set_name: RedPajamaStackExchange


Aisha (Rhea Chakraborty) and Dev (Varun Mitra) decide to end their marriage due to their ideological differences. Years later, they meet on a train journey where they are confronted with their past choices and relationship.
Jalebi, the hindi remake of a hit Bengali film of the same name, starring Rhea Chakraborty and Varun Mitra, is quite bland and tasteless. The Pushpdeep Bharadwaj film tells the story of a couple who reflect on their disastrous relationship while travelling on a train from Mumbai to Delhi, trying to figure out how to move on with their lives. While the premise is highly relevant in today's day and age, the storytelling isn't strong enough to establish the emotional connection with the audience and take them along for the journey with the film's protagonists.
Aisha (Rhea Chakraborty) gets married to Dev (Varun Mitra) only to find out that marriage isn't her cup of tea. Post the split, they end up meeting on the train and the story is narrated through numerous flashbacks. The film has a lot of supporting characters, co-passengers in the train, who do not really lend much to the story. The songs are lack lustre and the performances by the lead characters very insipid. Although the film picks up towards the end, it fails to make up for the harrowing, tear jerking, never ending script leading upto the climax. Overall, you would be glad to have missed this train.


This course for serious makers, and for students new to imagemaking. Imagemaking is a fluid and exciting area of graphic design that comes out of practice and process: experimenting fearlessly, showing and sharing ideas, and giving and receiving knowledgeable and constructive input.
- learn how to make, manipulate and arrange images to create compositions, eventually culminating in the design and production of an-image-based book.
The first half of the course is an opportunity to experiment and explore imagemaking in order to expand your visual vocabulary. You will create pieces that are expressive, meditative, or 'design-y' to instigate, evoke, experiment, record, explain, or try out a media.
In the second two weeks, we'll invite the images to deliberately and intentionally carry meaning and communication through relational moves like juxtaposition, composition, and context. We'll look at developing and expanding the range of approaches for putting things together by composing page spreads with your images. Since nothing exists without context, we look at how to intentionally drive the image's connotations, meanings, and associations generated through elements of composition and "visual contrasts." Ultimately, we will take the images that you create and make a book from them.
The results of your assignments (and experiments) may generate something completely unknowable now or in the future—and that's the goal.
Welcome! This we will introduce image-based research and investigate these images in a design context using a range of techniques. You will then choose a subject of your own to research that will become the basis for your experiments and designs in the coming weeks.
This week is a making session! You will take the subject you selected last week and think about it in different ways. From simple to complex, hand to digital, realistic to abstract and everything in between, we'll explore and experiment freely. We'll also consider different modes of representation, and try a hand at creating our own ranges of representation with images.
In this final week, we will pull together your work from the previous weeks to make spreads using 10-20 of your favorite images from your assignments and compile them into a self-bound booklet.
by Kit is taking this course right now and found the course difficulty to be easy.
I couldn't even start it, because although it's labeled as a free class, it's actuallly only free for the first seven days, which is quite exciting because I was really interested in this class. Unfortunately I can't afford the almost fifty dollars a month and I don't qualify for the financial aid. I wish there had been something before I was already on my way to signing up for everything, it feels a bit misleading. At the very least, it's very frustrating.
The first half of the course was very helpful and it was about getting started with images. Instead of continuing and finishing images though the second half was about creating a booklet with the image-sketches/potential images. Of course, a layout is an image too, but maybe change the course title accordingly?


text:
Dóra Leimeter, född 8 maj 1996 i Budapest, är en ungersk vattenpolospelare.

Leimeter gjorde 15 mål när Ungerns damlandslag i vattenpolo tog EM-brons i Budapest 2020 och hon ingick i det ungerska landslag som tog brons i vattenpoloturneringen vid olympiska sommarspelen 2020.

Leimeter tog VM-silver i samband med världsmästerskapen i simsport 2022 i Budapest.

Referenser

Ungerska vattenpolospelare
Ungerska olympiska bronsmedaljörer
Olympiska bronsmedaljörer 2020
Tävlande i vattenpolo vid olympiska sommarspelen 2020
Tävlande vid olympiska sommarspelen 2020 från Ungern
Ungerska idrottare under 2000-talet
Idrottare från Budapest
Födda 1996
Levande personer
Kvinnor

redpajama_set_name: RedPajamaWikipedia


I can make my own shirts, my own shorts and my own dresses but the one thing I cannot make are shoes. That is why for me, I think buying shoes (quality ones) are worth the splurge.
This morning, as I was running out the door, I've discovered that my favourite(an understatement) pair of shoes were ripped. I was devastated and I realized I needed a pair of shoes that could replace my all time favourite, Dr. Martens.
Normally, I would have ran out the door and grabbed the exact same pair of shoes (the classic 8 eye boot) without hesitation. Maybe it was the fact that there was a gigantic rip at the back of my left boot or maybe it was the fact that it was covered in salt stains...but I realized I didn't want to invest in another one.
R.I.P...it's been a nice walk.


You may be wondering why I need more color on my boards. It's that time of year again where PCB artisans all around the world are gearing up for badgecon DEF CON. For the last few years, independent badge makers have come together to form a demoscene of hardware creation. This year, add-ons for badges are a thing, and everyone is getting in on the game. Tindie is filled with amazing electronic badges and add-ons that will be found at this year's DEF CON. There are badges featuring the Cromulon from Rick and Morty, baby Benders from Futurama, pikachus, and glowing tacos.
This is all about badge art, but when it comes to rendering an image in fiberglass and soldermask, everyone is working with a limited palette. Yes, you can get pink and orange soldermask, but I can't find a place that will do it inexpensively. For any PCB, your choice of colors are only green, red, yellow, blue, purple, black, or white. No, you can't mix them.
But I want both orange and blue, on the same board, cheaply and easily — here's how I did it.


text:
Gjk.c
Gilbert-Johnson-Keerthi (GJK) collision detection algorithm in 200 lines of clean plain C
wtfpl
gjk.c – Gilbert-Johnson-Keerthi In Plain C
This is a rough but fast implementation of GJK collision detection algorithm in plain C. Just one C file, less than 200 lines, no dependencies. It is in 2D for now, full 3D version is upcoming... This 2D-version uses Minkowski sums and builds a triangle-simplex in Minkowski space to tell if two arbitrary convex polygons are colliding. 3D-version will be roughly the same, but will build a tetrahedron-simplex inside a 3-dimensional Minkowski space. It currently only tells if there is a collision or not. C-code for distance and contact points coming soon.
Fuck licenses and copyright. I made it for learning purposes, this is public knowledge and it's absolutely free for any usage.
This is an illustration of the example case from dyn4j.
The two tested polygons are defined as arrays of plain C vector struct type. This implementation of GJK doesn't really care about the order of the vertices in the arrays, as it treats all sets of points as convex polygons.
struct _vec2 { float x; float y; };
typedef struct _vec2 vec2;
int main(int argc, const char * argv[]) {
// test case from dyn4j
vec2 vertices1[] = {
{ 4, 11 },
{ 4, 5 },
{ 10, 2 },
size_t count1 = sizeof (vertices1) / sizeof (vec2); // == 3
int collisionDetected = gjk (vertices1, count1, vertices2, count2);
printf (collisionDetected ? "Bodies collide!\n" : "No collision\n");
The goal of this explanation is to help people visualize the logic of GJK. To explain it we have to oversimplify certain things. There's no complicated math except basic arithmetic and a little bit of vector math, nothing more, so that a 3rd-grader could understand it. It is actually not very difficult to have GJK algorithm explained in a proper understandable way from ground up.
At the very top level GJK tells if two arbitrary shapes are intersecting (colliding) or not. The algorithm is used to calculate the depth of intersection (collision distance). A collision occurs when two shapes try to occupy the same points in space at the same time. The space can be of any nature. It might be your in-game world simulation, or a calculation on a table of statistical data, or a built-in navigation system for a robot or any other application you can imagine. You can use it for calculating collisions of solid bodies and numeric intersections of any kind. You can have as many dimensions as you want, the amount of dimensions does not really matter, the logic is the same for 1D, 2D, 3D, etc... With GJK you can even calculate collisions in 4D if you're able to comprehend this.
The algorithm itself does not require any hard math whatsoever, it's actually very intuitive and easy. It takes an arithmetic difference of two shapes by subtracting all points of one shape from all points of another shape. If two shapes share a common point, subtracting that point from itself results in a difference of zero. So, if zero is found in the result then there's a collision. In fact, the algorithm does not have to calculate all differences for all possible pairs of points, only a small subset of significant points is examined, therefore it works very fast while being very accurate.
In order to understand GJK one has to build an imaginary visualization of what is going on under the hood. Once you see the picture in your head, you can implement it and even tweak it for your needs.
A 1D Intro
Let's start with a naive example of computing a difference of two shapes in one dimension. A segment of a number line is an example of 1D-shape. Imagine we have two segments on the number line: segment [1,3] and segment [2,4]:
Zero is our point of reference on the number line, so we call it the Origin. Easy enough. It is obvious that our segments occupy some common region of our 1D-space, so they must be intersecting or colliding, you can tell that just by looking at the representation of both segments in same 1D-space (on the same line). Let's confirm arithmetically that these segments indeed intersect. We do that by subtracting all points of segment [2,4] from all points of segment [1,3] to see what we get on a number line.
1 - 2 = -1
2 - 2 =  0
We got a lot of numbers, many of them more than once. The resulting set of points (numbers) is larger than each of our initial sets of points of two shapes. Let's plot these resulting points in our 1D-space and look at the shape of resulting segment on the number line:
So after all we have resulting segment [-3,1] that covers points -3, -2, -1, 0 and 1. Because two initial shapes had some points in common the resulting segment contains a zero. This comes from a simple fact, that when you subtract a point (which is a number) from itself you inevitably end up with a zero. Note, that our initial segments had points 2 and 3 in common. When we subtracted 2 from 2 we got 0. When we subtracted 3 from 3 we also got a zero. This is quite obvious. So, if two shapes have at least one common point, because you subtract that point from itself, the resulting set must contain zero (the Origin) at least once. This is the key of GJK which says: if the Origin is contained inside the resulting set then initial shapes must have collided or kissed at least. Once you get it, you can then apply it to any number of dimensions.
Now let's take a look at a counter-example, say we have two segments [-2,-1] and [1,3]:
We can visually ensure that segment [-2,-1] occupies a different region of number line than that of segment [1,3]. There's a gap between our initial shapes, so these two shapes do not intersect in our 1D-space, therefore there's no collision. Let's prove that arithmetically by subtracting all points of any of the two segments from all points of the other.
1 - (-1) = 1 + 1 = 2
And we again draw the resulting segment on a number line in our imaginary 1D-space:
We got another bigger segment [2,5] that represents a difference of all the points of two initial segments but this time it does not contain the Origin. That is, the resulting set of points does not include zero, because initial segments did not have any points in common so they indeed occupy different regions of our number line and don't intersect.
Now, if our initial shapes were too big (long initial segments) we would have to calculate too many differences from too many pairs of points. But it's actually easy to see, that we only need to calculate the intersection between the endpoints of two segments, ignoring all the inside points of both segments.
Consider two segments [10,20] and [5,40]:
Now subtract their four endpoints from each other:
10 - 5  =   5
10 - 40 = -30
20 - 5  =  15
The resulting segment [-30,15] would look like this:
Notice that when we subtract the opposite points of initial shapes from one another, the resulting difference number lands either to the left or to the right of the Origin (which is zero) on the number line. Say, we take the leftmost point of segment [5,40] (number 5) and subtract it from the rightmost point of segment [10,20] (number 20) the resulting number 20 - 5 = 15 is positive, so it lands to the right of zero on the number line. Then we take the rightmost point of segment [5,40] (number 40 this time) and subtract it from the leftmost point of segment [10,20] (number 10) the resulting number 10 - 40 = -30 is negative, so it lands to the left of zero on the number line that is exactly opposite to the first positive difference point 15. We say these points are opposite directionwise. Therefore the Origin is between two resulting points enclosing it.
We ignored all insignificant internal points and only took the endpoints of initial segments into account thus reducing our calculation to four basic arithmetic operations (subtractions). We did that by switching to a simpler representation of a segment (only two endpoints instead of all points contained inside an initial segment). A simpler representation of the difference of two shapes is called a simplex. It literally means 'the simplest possible'. The simplest possible thing on a one-dimensional number-line is a number (a single point in 1D-space is called a 0-simplex). A segment is the simplest possible shape sufficient to contain multiple points of a number line (a segment of two points in 1D space is called a 1-simplex). Even if one segment covers the other segment in its entirety (a segment fully contains another segment) – you can still detect an intersection of them in space. And it does not matter which one you're subtracting from, the resulting set will still contain the Origin at zero.
GJK also works if two initial shapes don't intersect but just barely touch. Say, we have two shapes, segment [1,2] and segment [2,3]:
These two segments only have one point in common. Subtracting their endpoints from each other gives:
And the resulting difference looks like:
Notice, that in case of only one common point the Origin is not inside resulting segment, but is actually one of its endpoints (the rightmost in this example). When your resulting segment has the Origin at one of its endpoints that means that your initial shapes do not collide, but merely touch at a single point (two segments have only one common point of intersection).
What GJK really says is: if you're able to build a simplex that contains (includes) the Origin then your shapes have at least one or more points of intersection (occupy same points in space).
WORK IN PROGRESS, A live demo of GJK in a 1D-space and a video of GJK in action coming up soon )
Moving On To 2D
Now let's take a look at the picture in 2D. Our 2D-space is now an xy-plane (which is represented by two orthogonal number lines instead of a single number line). Every point in our 2D-space now has two xy-coordinates instead of one number, that is, each point is now a 2D-vector. Suppose we have two basic 2D-shapes – a rectangle ABCD intersecting a triangle EFG on a plane.
These shapes are represented by the following sets of points (2D-vectors, which are pairs of xy-coordinates):
A (1, 3)
B (5, 3)
C (5, 1)
D (1, 1)
E (2, 4)
F (4, 4)
G (3, 2)
Now, because we have much more numbers here, the arithmetic becomes a little more involved, but it's still very easy – we literally subtract all points of one shape from all points of another shape one by one.
A - E = (1 - 2, 3 - 4) = (-1, -1)
A - F = (1 - 4, 3 - 4) = (-2, -1)
A - G = (1 - 3, 3 - 2) = (-2,  1)
B - E = (5 - 2, 3 - 4) = ( 3, -1)
B - F = (5 - 4, 3 - 4) = ( 1, -1)
B - G = (5 - 3, 3 - 2) = ( 2,  1)
C - E = (5 - 2, 1 - 4) = ( 3, -3)
C - F = (5 - 4, 1 - 4) = ( 1, -3)
C - G = (5 - 3, 1 - 2) = ( 2, -1)
D - E = (1 - 2, 1 - 4) = (-1, -3)
D - F = (1 - 4, 1 - 4) = (-3, -3)
D - G = (1 - 3, 1 - 2) = (-2, -1)
After plotting all of 12 resulting points in our 2D-space and connecting the outermost points with lines we get the following difference shape:
GJK says that if we're able to enclose the Origin within the resulting shape then two initial shapes must have collided. We immediately see that this shape actually contains the Origin. Therefore we can visually confirm that our initial rectangle ABCD indeed intersects our initial triangle EFG.
Also note, that we subtracted all points from all other points (calculated all combinations of pairs) which yields some points inside our resulting shape. But as with 1D, we will optimise the algorithm to skip all internal points entirely.
Building The Simplex
Now, remember, in 1D to determine whether the resulting segment contains the Origin we check if a primitive inequality leftEndpoint < Origin < rightEndpoint holds. We can think of it as if the segment surrounds the Origin from all sides of 1D space (from both left and right, as there are only 2 relative sides in one dimension on our sketch). In 1D for an object to be able to surround any point (the Origin is the zero point on a number line), that object must itself consist of at least two of its own points (in other words, it must be a segment defined by its two points on a number line). Therefore the 1D-version is trying to build a simplex of two endpoints (a segment on a number line). And then it checks whether the Origin is contained within the resulting segment.
In 2D the process is similar. We can immediately tell if the Origin is inside the resulting polygon shape just by a brief visual inspection. This is done by the natural wiring of human brains. But a machine cannot distinguish inside from outside unless you teach it how to do that. It's a lot easier for a machine to see if a point is contained inside a simple shape like a triangle or a circle, rather than a more complex shape like a general polygon with N vertices or some arbitrary irregular shape. Moreover, the algorithm has to do that in a fast but accurate way in order to be suitable for general-purpose collision detection.
And this is where the true power of simplicity of GJK comes into play. Think this way: you need at least two points in 1D to surround the Origin. So a 1D segment of two points is a 1-simplex. But in 2D two points are not enough to surround anything on a plane. Two points define a single straight line on a plane, but a straight line cannot enclose anything, because it's a line and it is straight. Therefore in 2D you need at least three points connected by segments, that is a triangle, to be able to enclose at least some area of the plane. The simplest possible shape that can enclose something in 2D is a triangle also known as 2-simplex.
Now our task of arithmetically enclosing the Origin within our resulting shape simplifies a little bit. We have to find such three points from our resulting set of points, that make a triangle that encloses the Origin. In other words, we need to build a 2-simplex that would satisfy our criteria. GJK can build a triangle and test if a certain point lies within that triangle, so we just made this task solvable by a machine.
After we subtracted our initial shapes one from another we got a resulting set of all of the points of a new shape that represents the difference of initial shapes. The most straightforward way to build such an Origin-enclosing triangle from a given set of points is to start taking triples of points (combinations of three points) to see if they form a triangle with the Origin inside it. If a triple of points makes such a triangle, then we can conclude that the difference of two shapes contains the Origin, so initial shapes must have collided or intersected. If not, we try some other triple, and that is done in a loop until we run out of points. If none of the triples did enclose the Origin, then no such triangle was found and there was no collision at all.
So, if we randomly select any three of our points and connect them with line segments, we will probably end up with a triangle similar to one of the following:
All of these triangles satisfy our criteria (all of them contain the Origin), so if we randomly select one of these and find the Origin inside, then we can immediately tell that there was a collision. But if we selected a triple of points that does not contain the Origin we might end up with something like this:
As long as the choice of points for our 2-simplex is random we might have to try all possible triples in worst case. Random walk is not the best strategy for finding a triangle that satisfies our criteria, there's a better algorithm for that ;) The goal of the algorithm is to find a combination of the best three points that enclose the Origin out of all possible triples of points, if such a combination exists at all. If such a triple does not exist then there is some distance between our initial shapes. The search for a simplex is the core of GJK.
In order to build the simplex efficiently the algorithm introduces a special routine that calculates the difference of two points of initial shapes. It is called a support function and it is the workhorse of the search.
The Support Function
Remember that in a 1D-space to obtain the resulting 1-simplex you subtract points from one another. The algorithm can skip 'internal' points and only compute the difference of outermost opposite points. The support function calculates the difference of opposite points in a more general way. As a bonus it also allows flat vs curved collisions! With it you can detect intersections of ellipses, circles, curves and splines in 2D and rounded shapes and more complex objects in 3D (which is cool).
Let's think of opposite points in two dimensions. Take a look at these examples of opposite points of a 2D-shape:
That is trivial. Now imagine you take not one but two arbitrary shapes and pick a random point of the first shape then pick a second point on the opposite side of the other shape. You might end up with something similar to this:
A difference of two points yields another point of resulting shape. That point is literally the distance vector. So, if you take a point of a shape and then choose a point of the other shape and then subtract the two points from one another, you get exact distance and direction between your shapes (at specific points).
Note, that when you subtract opposite points of two shapes your resulting point-vector will always land somewhere on the contour (an outermost edge) of your resulting shape. Below is an illustration of how a difference of two opposite points (on the left) finally lands on the contour of resulting shape (on the right).
The left side of the picture shows our simulated world space. On the right is our 2D Minkowski space. In GJK you can think of Minkowski space as if it was an imaginary world of shape differences. By subtracting two points in real world we therefore obtain a new point in another surreal world. It is also often called a mapping or a projection of a real-world intersection into Minkowski space (into the world of differences). The result in Minkowski space looks like a weird inside-out union as if one shape is "swept" along the contour of the other. But this is how all intersections really look like in 2D.
It's easy to show arithmetically that the resulting point is obtained by taking the difference of the two opposing points:
A(x1, y1) - B(x2, y2) = C(x1 - x2, y1 - y2)
A(3,  1) -  B(1, -1) =  C(3 - 1, 1 - (-1)) = C(2, 2)
Resulting point (2, 2) ends up exactly on the contour of our difference shape. If initial points are opposite their difference will always be one of the outermost ("external") points of the resulting shape. Also notice, that resulting distance vector (2, 2) is in one-to-one correspondence to the distance between the two initial opposite points. They are literally the same.
The support function of GJK maps a difference of two real-world points into Minkowski space. It seeks for two opposite points which are furthest apart along a given direction and returns their difference. In seek of opposite points along a direction the support function does the following:
Start at the Origin and choose any direction you like (denoted as D on the image above). A direction is itself a vector, pointing somewhere away from the Origin. It can be random, you choose whatever you want for a start, later you'll see why initial direction doesn't really matter. The direction vector always starts at the Origin and is sometimes written as OD = D(x,y) - O(0,0) = D(x,y) (that is a direction from O towards D).
Take the first of two shapes. It does not matter which one of the two is first. From the Origin seek for the furthest point of first shape in direction D. To find the furthest point in direction D calculate the dot product of all the point-vectors of the first shape with direction D. This is the same as taking magnitudes (or distances) from the Origin to each point of the first shape in direction D. It is also often called projecting a point-vector onto a direction-vector. The distance to point A along direction D is the projection of vector A onto vector D. The most distant point A along D will have the greatest dot product of A and D. This way our first most distant point from the Origin along direction D is found. Note that a dot product can result in a negative projected vector.
Next an opposite point of the other shape must be found. To do that the support function switches the direction D to the opposite, literally flipping it D = -D. The process from previous step is repeated, but this time with the other shape in a reverse direction -D. It looks for a point of the second shape that is most distant from the Origin along direction -D. To find the most distant point it calculates all dot products of all the point-vectors of the second shape and direction-vector -D. Then it takes the point which has the greatest dot product with -D. This way the second point B is found that is most distant from the Origin and is also opposite to the first point.
Once two opposite points A and B have been found, subtract one of them from the other and done. It doesn't matter which one you are subtracting from. The resulting vector is a mapping of their difference into 2D Minkowski space.
In other words, the support function takes an arbitrary line and two opposite points furthest from the Origin along that line, one point from each of the initial shapes. This is similar to subtracting segments in 1D. The support function finds the endpoints of two shapes along some direction-line and returns their difference that is another point in Minkowski space. On a one-dimensional number line the resulting point is a 1D-number. One a two-dimensional coordinate plane the resulting point is a 2D-vector (it has two coordinates).
Now its easy to show that it does not matter which initial direction you choose to start with. The support function does not care about given initial direction at all. For example, if we choose a different arbitrary D, we might end up with something like this:
It doesn't matter which direction D you choose to seek for opposite points A and B. By taking their difference you get a point C somewhere on a contour in Minkowski space. And it's easy to verify arithmetically that the intersection of opposite points A and B along any direction D still yields one of many points on the contour of our resulting shape:
A(2, -2) - B(-1, 2) = C(2 - (-1), -2 - 2) = C(3, -4)
So, in general the support function can work in any given direction and in any given space. You give it two shapes and a direction, and then it finds two opposite points in your space and returns their intersection in Minkowski space. In mathematics the intersection is usually denoted with symbol ∩.
C = support (shape1, shape2, D); // return a point of (shape1 ∩ shape2) along arbitrary direction D
The intersection of two points always yields a third point. In 1D a point is a number. Thus, an intersection of two numbers or two points in 1D gives a third number or another 1D-point. In 2D an intersection of two vectors or two points gives a third vector or another 2D-point.
A Word On Math
To calculate the difference of two numbers we subtract one of them from the other like this: A - B = C. In 1D which number of the two is A and which one is B does not matter, the algorithm works either way. This is because in 1D you have only one possible direction that is the actual number line itself. But in general when dealing with 2D or 3D coordinate vectors (which is usually the case in many applications) the order of subtraction actually does matter. A more accurate way of representing the difference of two vectors in Minkowski space is to take one vector and sum it with a negated version of the other vector, so that A + (-B) = C. Because of this fact the Minkowski support function is often defined as a sum of the first point-vector with the negated version of the second point-vector. After negating the second vector you simply add it to the first one to get their arithmetic total result. This is why the support function is called Minkowski addition or Minkowski sum and you will probably never hear of Minkowski subtraction nor Minkowski difference.
Here's how an implementation of the Minkowski sum support function for any space of arbitrary amount of dimensions might look like in pseudocode:
// Return an arithmetic sum of two point-vectors
// A 1D-vector has only one component (one coordinate on a number line)
// In general a vector has one or more components
vec sum (vec a, vec b) {
return a + b; // [ a.x + b.x, a.y + b.y, a.z + b.z, ... ]
// Dot product is the sum of all corresponding components of both vectors multiplied
float dotProduct (vec a, vec b) {
return a * b; // a.x * b.x + a.y * b.y + a.z * b.z + ...
// Get furthest vertex along a certain direction d
// This is the same as finding max dot product with d
// In 1D direction is always 1 or -1 (to the left or to the right of the Origin)
size_t indexOfFurthestPoint (const vec * vertices, size_t count, vec d) {
size_t index = 0;
float maxProduct = dotProduct (d, vertices[index]);
for (size_t i = 1; i < count; i++) {
float product = dotProduct (d, vertices[i]); // may be negative
if (product > maxProduct) {
maxProduct = product;
index = i;
// Minkowski sum support function for GJK
vec support (const vec * vertices1, size_t count1, // first shape
const vec * vertices2, size_t count2, // second shape
vec d) {                              // direction
// get furthest point of first body along an arbitrary direction
size_t i = indexOfFurthestPoint (vertices1, count1, d);
// get furthest point of second body along the opposite direction
// note that this time direction is negated
size_t j = indexOfFurthestPoint (vertices2, count2, -d);
// return the Minkowski sum of two points to see if bodies 'overlap'
// note that the second point-vector is negated, a + (-b) = c
return sum (vertices1[i], -vertices2[j]);
It does not really care how many dimensions are there in space. So given a direction and two shapes the support function always returns another point regardless of how many dimensions you have. It works the same for 1D, 2D, 3D, etc... The point returned by the support function is always on the contour of intersection. This is because the initial points involved in the intersection are opposite.
Remember, the whole purpose of having a support function was to help us quickly build the simplex for GJK. The support function is used in the search for a 2-simplex that encloses the Origin in 2D. Now that we have such a function, we can move on and build the rest of the algorithm on top of it.
This is where the actual logic of GJK kicks in. The general plan of GJK is:
Find best points for a simplex with the help of the support function.
Check if a simplex of those points encloses the Origin from all sides.
If it does, there is a collision – hooray and thanks for the support, support function )
If it doesn't, well... try other points, why not?
If a simplex cannot be built at all no matter how many times you try – it might be a degenerate case (explained later).
If it's not a degenerate case, then there's no collision.
All of that is done in a loop. The algorithm tries different points and checks if they satisfy the condition. The whole process is called evolution. If it succeeds to enclose the Origin in another branch of evolution (upon another loop iteration), then the intersection is detected. If not, it tries again until finally it either succeeds or fails.
Some people might be reasonably worried of the possibility that the evolution of GJK runs out of control and continues on and on without ever stopping. It might even become intelligent some day and who knows what could happen... So they add a limit of iterations into their implementations which is a countdown that cuts power off when the game is over, forcing the algorithm to stop. It's like an emergency halt or a safety button in case something goes wrong with float number precision or whatever. But that is actually not necessary in general.
In search for a 2-simplex the algorithm has to obtain 3 points one by one to make a triangle. The resulting set of points is initially empty. The process of finding three points is done step-by-step. First, the algorithm finds the first point and adds it to the resulting set. Then it finds and adds the second point, and then it finds and adds the third one. So, while being built, the 2-simplex kinda evolves actually passing through all stages of evolution from a 0-simplex (one point, the first one in the resulting set), through a 1-simplex (segment of two points, with the second point added to the set), to a 2-simplex (three points, with the third point added to the resulting set).
A 2-simplex (a triangle) contains or consists of 1-simplices (segments). A 1-simplex (a segment) consists of even simpler 0-simplices (points). It's clear that each new dimension adds one more point to the simplex. So, in general:
0-simplex =    nothing    + 1 point = 1 point
1-simplex =   0-simplex   + 1 point = 2 points
...    =      ...      + 1 point =    ...
N-simplex = (N-1)-simplex + 1 point = N+1 points
GJK evolves the simplex from the very beginning each time, restarting the evolution when no further progress is possible in current branch. So a simplex passes through all stages of its evolution upon each iteration of the main loop.
Let us do a single iteration of the main evolution loop by an example, step-by-step. Below is an illustration of a pair of slightly different intersecting shapes (for example), and their intersection Minkowski sum on the surreal side to the right. The Minkowski sum is unknown to our algorithm at the moment, as we haven't calculated all the differences of points yet and, in fact, we won't need the full resulting shape, we only need best three points to surround the Origin and that's it. So the Minkowski sum is currently unknown and we're drawing it in full on the right just for visual explicacy:
To build a 2-simplex in 2D we need three points from our resulting Minkowski set that would enclose the Origin within a triangle and we have our nice support function for finding best points for that. Before we begin the search for three points we reserve a place for each one of them and label or tag each place with capital letters C, B and A in that order. Their naming might be a little confusing, as we've used A and B to denote opposite points previously in this text, but it's an ancient tradition, sorry, can't do much about that. These will be placeholders for the points we might find in the search process. Initially our resulting set of points is empty (all placeholders are empty).
The first point C is the easiest to obtain. You just choose a random direction D and call the support function which calculates that point for you as we did earlier. Initial direction D is chosen randomly and passed along with the shapes to the support function. The support function then finds opposite points of two shapes along the given direction (labelled below as a and b in lowercase for less confusion) and returns their Minkowski sum which is point C on the right, the first point of our simplex (which is a 0-simplex for now).
Once you get the first resulting point, you place it in placeholder C. From now on we will be referring to that point by that label or tag C. Don't forget, that C is a point on the difference contour line in Minkowski space. Now we have a 0-simplex (a point) in our resulting set and it is the first stage of current iteration of evolution. Note, that the support function looks in both D and its opposite -D in search for points a and b. This is what we get after executing the first step and obtaining point C in Minkowski space:
Once we got the first difference of most distant opposite points along a certain direction-line we need to choose a different direction to find the next point of our simplex in Minkowski resulting set. Remember, that the magic of GJK says that we have to surround the Origin from all sides to detect a collision. As with 1D number line where a segment can surround the Origin with two of its endpoints, in 2D we can surround the Origin from all sides with three endpoints or vertices of a triangle. So our goal is to find such a 2-simplex that would enclose the Origin within itself.
The logic behind this can be described in the following way: imagine we stand at point C and look towards the Origin from that perspective. We want to find next point that would be beyond the Origin as seen by us. If there's no such point then we are not reaching far enough and we will not be able to surround the Origin with a triangle using current point C.
If we cannot reach for a point beyond the Origin from current standpoint C, then there's probably some distance between initial shapes (at least those two shapes don't intersect along direction D). So, in that case no collision is detected. The halting criteria of GJK algorithm says that current iteration stops if our simplex fails to include (or surround) the Origin, handling these cases will be explained in more detail later in this text.
Standing at point C we need to check if there's a point that is further away from us than the Origin is, in the direction from us towards the Origin. The direction from point C towards the Origin O is the direction CO which is the reversed opposite of direction from Origin to point C, so that CO == -OC. Therefore we should be looking in direction CO next as we hope to find some point beyond the Origin there.
The idea of looking beyond Origin from your current standpoint is the key principle of the search for simplex in GJK. It helps to quickly find the biggest simplex by taking the most distant opposite points of Minkowski sum. The bigger the simplex the higher the chances that it will surround the Origin upon some early iteration.
The second point B is quite easy to get. From now on we set new direction D = -OC which is equal to CO, and we will refer to it as our new direction D without the negative sign. The support function finds the other two most distant opposite points a and b and it looks in both directions D and -D (yes, again) in the process. Note, that new direction vector D is different from the first initial direction vector D as it now points in the opposite way.
You call the support function with your new opposite direction D and get the second point which is labelled or tagged as capital B. And now there's a 1-simplex (a segment of two points, C and B) in the resulting set, and it is the second stage of that same iteration of evolution. Here's what we get after the second step:
By calling the support function the second time with the opposite direction you get a second point B which is another point on the same contour in Minkowski space. That second point B is exactly opposite to the first point C, because initial directions passed into the support function were opposite, right?
Having point B we need to verify that it is indeed beyond Origin as seen from point C. In other words, we have to check if point B is further away from point C than the Origin is (in direction from C towards the Origin). If a dot product of CO ⋅ OB is positive, then point B is really beyond the Origin as seen from point C and the evolution continues, otherwise there's no collision and the evolution stops or restarts in a different direction. In geometry the sign of dot product of two vectors basically tells if their orientation is roughly the same.
if ((CO ⋅ OB) > 0) // test if point B is beyond Origin as seen from point C
This test for a point beyond Origin can also be explained as follows: we know that point C is located on the contour of Minkowski sum (this is a feature of our support function) and point B is on the opposite side of that same contour, so the Origin must be in between C and B, otherwise we're not reaching far enough to surround it, and if we cannot surround it, then there's probably some distance between the two initial shapes, therefore no intersection.
Remember that the algorithm doesn't know anything about the whole set of Minkowski points, it currently only knows about points C and B that were found during first two stages of the evolution. Now let's take a look at the Minkowski space as seen by GJK algorithm at this point. The left part of the image below shows the 1-simplex of two points (segment CB) in Minkowski space, and on the right we see the same segment with the full set of Minkowski sum points added for visual reference and for explanation purposes (the algorithm only sees the left side of this picture, not the right side):
The algorithm's current view into surreal Minkowski world is on the left side of the image above. There's 1-simplex segment CB of two points. The simplex has evolved from being a single point C 0-simplex into a 1-simplex or a segment of two points CB, in other words, our simplex has become a little more complex and obtained an extra dimension )
Before we proceed to the third point A we might need to gain even more intuition about what is going on here. Seeing that segment CB on the image above and seeing the whole set of Minkowski sum points on the right side, humans can quickly visually locate the third point to enclose the Origin. Easy. But for a machine to know where to look for the third point, we have to make a critical decision in which direction it should be looking next.
The logic of GJK goes this way: imagine we stand anywhere on the segment CB and look towards the Origin from that perspective. We want to find such a third point that would be at least beyond the Origin (as seen by us relatively to the segment CB that we're standing on). So, again, if we cannot find a third point beyond the Origin then we will not be able to surround it using current segment CB and there's no collision at least on this iteration.
The image above shows the direction to look for the last point of triangle simplex. To find the exact direction vector, you just take one of perpendiculars to the segment CB. If you tilt your head to the right a little while looking at the segment CB, you will immediately notice the following simple fact: any segment kinda cuts the coordinate plane into two halves, to the left and to the right of the segment. And the Origin always ends up either on one side of the segment CB or on the other side. All we have to do to find the next direction vector is just take a perpendicular (often called a normal) to CB that points towards the Origin.
There are two possible directions perpendicular to segment CB, the one pointing towards the Origin and the one pointing the opposite way (away from the Origin). In order to get the one pointing towards the Origin, we can do a simple vector math trick, called vector triple product. It works like this: take a cross product of the segment CB with a segment CO (from endpoint to the Origin) and then take a cross product of the result with the segment CB again, basically two cross products done sequentially, involving the same segment CB twice:
CB ⨯ CO ⨯ CB
There's also a very fast formula for this (an expanded equation) aka triple product expansion with only a few multiplications and subtractions for calculating the resulting perpendicular:
a ⨯ (b ⨯ c) = b(a ⋅ c) - c(a ⋅ b)
You have to be precise with the orientation of vectors when using the expansion formula, but if done carefully and correctly, this always gives a perpendicular to segment CB pointing towards the Origin.
We set our final direction D to that perpendicular to CB pointing towards Origin. That will be a direction to search for point A of our triangle simplex. This is also the last stage of the evolution of the 2-simplex. We call our support function and pass new direction D along with the two shapes. The image below shows the result after calling the support function for the 3rd time:
We obtained point A and now we have a complete triangle of three points in total. Our simplex has evolved from a 0-simplex point through a 1-simplex segment into a 2-simplex triangle. Also notice, that we did not calculate all points of Minkowski sum, we only calculated three of all possible points. This is one of the reasons why this algorithm actually works very fast in narrow-phase collision detection. It just doesn't have to calculate all points, so it does not know anything about the full Minkowski set. Here's how it sees the triangle with point A added to the simplex in memory (remember, it only knows about the left side of the image below, but not about the right side which is there for explanation purposes):
Now that we have all three points for a complete triangle (a full 2-simplex), the only task that's left is to test if the Origin is really contained inside that triangle. In other words, if our resulting simplex surrounds the Origin from all sides, then the whole Minkowski sum also does surround the Origin as well, and it follows that there was a collision between two initial shapes. The most straightforward way to test if a point is inside a triangle (the Origin is a point at zero) is to do a bunch of dot product operations.
For each edge (each side) of a triangle you need two things: a normal vector (a perpendicular) to that side towards the Origin and a vector from the Origin to opposite vertex of the triangle. Then you check if dot product of the two vectors is positive (greater than zero)...
WORK IN PROGRESS, to be continued soon. A live demo of GJK in a 2D-space and a video of GJK in action coming up )
Voronoi Para Nos
WORK IN PROGRESS, to be continued soon... )
A Touch Of Degenerate Case
A collision is when two bodies occupy the same points in space. In two dimensions a collision is either an intersection of two shapes (when shapes kinda "overlap") or they might not intersect but instead one shape could just touch the other, and that is also considered to be a collision. There's even more details to the nature of collisions, because there are different types of touch...
A full-on collision when a shape overlaps or penetrates another shape usually looks like this:
When 2D-shapes overlap there is usually at least one way to build a 2-simplex that encloses the Origin. But there can be other types of non-penetrating collisions without overlapping, when shapes touch edge-to-edge or meet at one single point. In GJK these collisions are usually called degenerate case. They are not collisions but contacts in common sense. By design GJK handles all degenerate cases absolutely fine.
Here are some examples of what a degenerate case collision (a touch) in GJK is:
It may seem like a lot of special cases to handle, but in fact, GJK already does that intrinsically.
A non-overlapping collision will yield a Minkowski sum that has the Origin on its edge or contour. Remember, in 1D, when two segments have only one common point, the Origin lands on the endpoint of resulting segment. In 2D, when there is only one common point, the Origin in Minkowski space will be located on the contour of your resulting 2D-intersection shape. If two shapes share a common face, then the Origin will be on one of the sides of triange simplex.
So, the Origin can either be inside the Minkowski sum, or it can be on the edge of the sum. And the trick is to check if the Origin is actually one of the points of your simplex. The Origin can also end up exactly on one of the sides of your simplex, between two points of the simplex.
Basically, to each stage of evolution you add a check, to see if the Origin is already included in your not-fully-evolved simplex or not. That is enough to detect all degenerate cases. If the Origin is already included in your half-built simplex upon some early stage of evolution, then you don't have to evolve it further. Then you can stop and signal a collision (or no collision, at your discretion). You can differentiate between a penetrating collision or not, by counting degenerate collisions or not counting them as being collisions.
Roundness And Curvature
What's very remarkable of this algorithm, is that the support function can be also defined for a huge variety of shapes. If every point of a shape can be derived from a simple formula (aka parametric equation) then your support function can use that equation to calculate differences of points. When geometry is defined in a parametric way there is no need to keep all points in memory. And you can also scale everything up and down as you like, do boolean combinations of shapes and much more... That's what vector graphics is about, but it's a whole other topic in itself, we won't dive deep into it here.
The key point is: a parametric equation can be an equation of a circle ((x - h)/r)² + ((y - k)/r)² = 1 or an equation of an ellipse (x - h)²/a² + (y - k)²/b² = 1, or some spline (!), or even a combination of polygons and conic sections. So, you can detect collisions and intersections of round shapes very accurately up to an exact point of contact. GJK is not restricted to polygons, you can do perfect circle collisions, and as we'll see later in the 3D section, spherical collisions are also possible as well.
The only restriction that still holds is that your shapes should be convex, not concave, so, any line crossing your shape should not intersect its contour more than twice. As long as your shapes are fat and bulgy, you'll be fine. But there's a hint: you can always make a concave shape from multiple convex shapes.
Adding 3D
A careful reader might have already noticed a pattern in the algorithm...
For a 1D number line we need a 1-simplex of two points to enclose the Origin. If we can find such two points then our shapes do intersect indeed. If we cannot find such two points then our initial shapes must have some distance (non-zero difference) between them. For 2D coordinate plane a 2-simplex of three points (a triangle) is necessary to enclose the Origin. In 3D space we need a 3-simplex of four points (a tetrahedron). These are all examples of simplest possible shape primitives in given dimensions.
Collision Details
The version of GJK that gives a boolean answer to a yes/no collision test is somewhat simplified. The algorithm is able to not only detect the fact of intersection, but is also capable of giving back the exact depth of penetration and information about points of contact, so that the collision could be handled properly.
The simplified yes/no test is often called a bastardized version of GJK algorithm in comparison to its original purpose of calculating detailed collisions. But the simplified version described in the text above is easier for understanding. Having understood the simple yes/no GJK test it is much easier to grasp the Gilbert-Johnson-Keerthi algorithm in its entirety along with a few useful concepts. We will proceed to cover the rest of GJK functionality below.
Distance or Depth Of Penetration
References (must see)
Most of the info (along with reference implementation) was taken from dyn4j. It has a very thorough explanation of GJK and it is definitely a must visit for those who need to understand the intricacies of the algorithm.
http://www.dyn4j.org/2010/04/gjk-gilbert-johnson-keerthi/ GJK description (+ a lot of other useful articles)
http://mollyrocket.com/849 Awesome old-school GJK / Minkowski space video by Casey Muratori
https://awesomeopensource.com/project/wnbittle/dyn4j Quality source code for reference
https://www.youtube.com/watch?v=-GZOGJ26yxE – A video of a seminar by Elmer Gilbert Professor Emeritus Aerospace Engineering, University of Michigan
P.S. 3D-version coming soon...
Alternatives To Gjk.c
Gjk.c ⭐ 693
Opengjk ⭐ 67
Fast and reliable implementation of the Gilbert-Johnson-Keerthi (GJK) algorithm for C, C# and Matlab
Gjk ⭐ 3
Real-time 3D collision detection for convex polyhedrons using the Gilbert–Johnson–Keerthi (GJK) algorithm
Gjk.c vs Opengjk
Gjk.c vs Gjk
C Projects (193,862)
Shape Projects (5,981)
Physics Projects (5,354)
Collision Projects (2,665)
Simplex Projects (541)
Collision Detection Projects (499)
Gjk Projects (16)
Physics Collision Projects (270)
C Physics Projects (196)
C Collision Projects (173)
C Shape Projects (145)
Shape Collision Projects (71)
Shape Physics Projects (68)
Physics Collision Detection Projects (61)
C Simplex Projects (35)
C Collision Detection Projects (33)
Shape Collision Detection Projects (18)
Shape Simplex Projects (7)
Shape (5,981)
Physics (5,354)
Collision (2,665)
Simplex (541)
Collision Detection (499)
Gjk (16)


Check out this You-Tube clip as she demonstrates her compost method.
What are the odds – I had Rosina here in my garden in Jamberoo today, then I get on the computer later and find an article about her in my RSS reader!
Rosina's a lovely, lovely lady and I really enjoyed showing her around. She commands a wealth of knowledge, showing me a few useful "weeds" I had growing and giving me lots of ideas for more things I can plant.
Wow, Rosina is a wealth of information and a bit of a treasure 🙂 I really enjoy reading about her ideas and tips – keep them coming!!


text:
Lauryn Snapp Published: November 4, 2022
Dimitrios Kambouris / Dia Dipasupil, Getty Images
Yung Gravy is playing up the saucy speculation that he only dates older women.
The "Betty (Get Money)" singer recently dropped in with PopCrush Nights hosts Donny Meacham and Lauryn Snapp to confirm the rumor that he likes to date "MILFs."
In particular, he's got some serious love for Martha Stewart. So much so that he says he even once took her out on a date!
"You might have to fight Pete Davidson over Martha Stewart! She did come out saying that she thinks [Pete] is pretty cute, and she would love to go out on a date with him," Meacham teased.
"I've already been on a date with her," Yung Gravy replied.
"So I am a step ahead ... A step ahead of Pete Davidson. I got a lot of love for Pete Davidson. He's a legend," the rapper continued, referencing Stewart's recent flirtation with Davidson.
We wonder if Stewart's sexy pool selfie had anything to do with Yung Gravy's crush on the 81-year-old mogul.
This isn't the first time Snoop Dogg's best friend has grabbed Yung Gravy's attention.
In 2020, Yung Gravy released "Martha Stewart," a song titled after the lifestyle business baddie. On the track, he raps:
Make maneuvers (Yeah), think I'm Martha Stewart (Woah) / Martha Stewart (Ayy), with some cougars (Baby) / Gravy with your mama in the kitchen, Martha Stewart (Ayy) / It's Martha Stewart, (Martha Stewart) I had to do her (Martha Stewart)
The viral hit eventually became the premise of a hilarious advertisement starring the pair, which Yung Gravy called a "dream collab."
The pair also posed for a cute photo together earlier this year for Valentine's Day.
See below:
At the 2022 MTV VMAs, Yung Gravy told Entertainment Tonight that he is attracted to MILFs for various reasons.
"They're more experienced. They are an under-serviced community. And they deserve more attention, so I thought I would be the one," he said.
Mind-Boggling 2022 Moments That Felt Like Pranks
We pulled together a list of 11 inexplicable news stories that have already gone viral this year. They might seem like jokes, but we regret to inform you that they were all very much real. Check them out below.
Source: Yung Gravy Says He Took Martha Stewart on a Date: 'A Step Ahead of Pete Davidson' (EXCLUSIVE)
Filed Under: Martha Stewart, PopCrush Nights, Yung Gravy
Baddie Martha Stewart Is Waiting for Her Friends to Die so She Can Date Their Husbands


text:
Korte, Floyd earn all-district honors
by October 21st, 2009 October 18th, 2020
Bethany Korte, left, and Carmen Floyd represented the Houston Lady Tigers on the all-district softball team.
Houston senior Bethany Korte and sophomore Carmen Floyd were recently named to the all-district softball team in Class 2 District 6.
Korte, the team's leadoff hitter and center fielder, led the team in most offensive categories. She batted .600 with a .690 on-base percentage and stole 23 bases while only being thrown out twice. Korte scored a team-leading 27 runs and only struck out four times in 54 at-bats.
"Bethany is the type of player that doesn't come around very often. She is the ultimate softball weapon," said first-year Lady Tigers coach Willy Walker. "She has a lot of natural ability and is one of the most explosive athletes I have seen at Houston in a lot of years."
Beginning with the softball team's inaugural season, Korte played all four years the program existed. Walker said Korte's attitude and work ethic was an example to her teammates.
Korte signed a letter of intent during the season to play softball at Evangel University.
"She had a dream and went out and got it," Walker said.
Floyd earned all-district honors as a pitcher after taking over the role of team ace midway through the season. She threw the team's only shutout of the season — a 11-0 five-inning victory Sept. 14 against Seymour.
Walker said Floyd spent the offseason perfecting her pitching motion and control.
"I was impressed the most with her willingness to work on her pitching all summer, while probably thinking that she wouldn't be pitching this season," Walker said.
At the plate, Floyd was one of the team's top power hitters. She batted .349 and hit the team's only home run to clear the fences.
Walker said Floyd was slowed by an ankle injury that forced her to miss a game.
"She is a much tougher kid than a lot of people might think," Walker said. "She played hurt most of the season but wouldn't use it for an excuse."
Raymondville School board meeting
Raymondville School board meeting is 6:30pm in the library media lab.


text:
"Cemetery of Splendor": Taking the big sleep in enchanting Thai film
"Cemetery of Splendor" has its Madison premiere on Wednesday at 7 p.m. at the Madison Museum of Contemporary Art, 227 State St. Free for non-members, $7 for all others. Not rated, 1:51, three stars out of four.
In the films of Thai director , the line between the living and the dead is not a wall, but a thin beaded curtain through which each side can see each other, wave to each other, even visit each other. In his last film, the beautiful and strange "Uncle Boonmee Who Can Recall His Past Lives," a dying man is visited at the dinner table by the ghosts of his wives and son (his son having turned into a red-eyed Chewbacca-looking creature) and he welcomes them warmly, like they had RSVP'ed ahead.
Weerasethakul's new film, "Cemetery of Splendor," is comparatively simpler than "Boonmee" — you won't see a princess get seduced by a talking catfish this time around. But that placid, normal-seeming exterior seems appropriate for a film that is about digging beneath the layers, digging to the past, digging to the subterranean heart of ourselves.
Much of the film takes place in an abandoned schoolhouse that has been converted into a military hospital, housing a group of soldier with a mysterious affliction. They're all fine physically, except that they've fallen asleep and won't wake up. A kindly volunteer nurse named Jenjira (Jenjira Pongpas Widner) watches over them, finding herself drawn to one soldier named Itt in particular (Banlop Lonmoi).
Jenjira also befriends a psychic named Keng (Jarinpattra Rueangram), who can read the thoughts of the soldiers and communicate them to their loved ones. She believes that this hospital that was once a schoolhouse was also, centuries ago, a great palace, and that the soldiers are sleeping because the ghosts of the king's army are drawing from their essences to aid in their battle. At one point, Keng takes Jenjira into the forest on a guided "tour" of the palace, as they look at piles of leaves and are able to see the pink stone of the edifice.
This sense of history, of the layers of the past that lurk beneath our present, is a powerful one, but one that Weerasekathul also has a bit of wry fun with. The city is dotted with kitschy dinosaur statues, suggesting the layers buried even deeper than that ancient palace. And, outside the windows of the hospital, we see construction crews digging up the dirt, ready to raze the school-hospital and lay fiber-optic cable in its place.
Keng also encounters a pair of friendly ghosts, who announce their true selves so matter-of-factly that it sends a shiver down the spine. And when Keng acts as a conduit for Itt to talk to Jenjira, what emerges is a strange and moving connection that seems to transcend ordinary human interactions.
"Cemetery" is a slow and contemplative film, and the fact that it lacks the obvious surreal touches of "Boonmee" sometime makes the viewer want to find a comfy bed near one of those soldiers. But it's not difficult or inaccessible, but a graceful invitation to go along on its metaphysical wanderings.
Posted by madisonmovie in Movie Review
Tagged: Apichatpong Weerasethakul, cemetery of splendor, uncle boonmee who can recall his past lives
← Instant Gratification: "Ex Machina" and four other good movies to watch on Amazon Prime and Netflix
"Heaven Knows What": Lacerating drama lets homeless junkie tell her own story →


Syracuse, N.Y. — Saundra Smokes, the award-winning columnist and editorial writer whose articles often spurred debate across Central New York, died this morning at Crouse Hospital.
Smokes, 57, who had battled diabetes for several years, collapsed in her Eastwood home Monday and was rushed to the hospital. The cause of death was cardiac arrest.


Cornell Tech today celebrated the official opening of its campus on Roosevelt Island with a dedication event attended by New York Governor Andrew Cuomo, New York City Mayor Bill de Blasio, former Mayor Mike Bloomberg, Cornell University President Martha Pollack, Technion President Peretz Lavie and Cornell Tech Dean Daniel Huttenlocher. Cornell Tech is the first campus ever built for the digital age, bringing together academia and industry to create pioneering leaders and transformational new research, products, companies and social ventures. Today marks the opening of the first phase of the Roosevelt Island campus, which features some of the most environmentally friendly and energy-efficient buildings in the world.
In 2011, Cornell Tech was named the winner of Mayor Mike Bloomberg's Administration's visionary Applied Sciences Competition, designed with the goal of diversifying the economy and creating a national hub for tech. The project, managed by the City's Economic Development Corporation, has been carried forward by the de Blasio administration, with the campus breaking ground in 2015. The City estimated in 2011 that the new campus would generate up to 8,000 permanent jobs, hundreds of spin-off companies and more than $23 billion in economic activity over a period of 35 years. The campus is built on 12 acres of City land.
"Thanks to our investments to foster key industries, create good-paying jobs, and attract top talent, New York is the center of the world for finance, advertising, media, the arts and international commerce, but we are still building our reputation as an internationally-recognized hub of cutting-edge science and technology. By harnessing the engineering expertise of Cornell and the entrepreneurial spirit of Technion, Cornell Tech's new campus will strengthen New York's future competitiveness and produce innovations that will change the world," said Governor Andrew Cuomo.
"As we work to keep New York City a leader in the 21st Century economy, we celebrate the opening of the Cornell Tech campus and the opportunities it opens up for our city and our people. I am proud to welcome our newest leading educational institution, which will become a tremendous catalyst for our tech sector. We won't stop here. Through Computer Science for All, the Tech Talent Pipeline and the new Union Square Tech Hub, we are building on the progress Mayor Bloomberg set in motion, and helping more New Yorkers become a part of this extraordinary success story," said Mayor Bill de Blasio.
"Cornell Tech is an investment in the future of New York City — a future that belongs to the generations to come, and the students here will help build it. Technological innovation played a central role in New York City becoming a global economic capital – and it must continue to play a central role for New York to remain a global economic capital. The companies and innovations spawned by Cornell Tech graduates will generate jobs for people across the economic spectrum and help our city compete with tech centers around the world, from Silicon Valley to Seoul," said Mike Bloomberg.
"Cornell Tech will create the leaders of tomorrow, bringing the brightest minds in the field of technology to Roosevelt Island. The digital age has not only improved the efficiency and productivity at the workplace, but created competitive high-paying salaries and stable jobs that keep overall unemployment rates lower. Cornell Tech is ahead of the curve by providing academic programs and training that will make this a world-renowned institution," said Assembly Member Rebecca A. Seawright.
"The new Cornell Tech campus is a wonderful addition to Roosevelt Island and will continue to propel New York City as a leader in technology and innovation. Not only will this state of the art campus generate thousands of permanent jobs and billions of dollars in economic activity over the next 30 years, but is also environmentally friendly and energy efficient. Many thanks to Cornell Tech and all of my colleagues in government and on Roosevelt Island that helped to complete this special project," said New York State Senator José M. Serrano.
"This milestone is a game-changer – and this campus is a New York City gem. As it prepares students for jobs of the future today, Cornell Tech will keep our city competitive in emerging industries tomorrow. This transformative project truly cements New York City as a global tech hub, and it illustrates what happens when government, academia, and industry all work together. Every stakeholder in this project should be exceptionally proud," said Comptroller Scott M. Stringer.
"As our world becomes more tech-centered, the Cornell Tech campus will allow New York City to be at the heart of the innovation, leadership — and most importantly, jobs — in this space. This campus will bring academics, research and business together and educate the bright minds of our future. I look forward to seeing all that Cornell Tech has to offer our City, and to working with Cornell Tech to ensure that New Yorkers from every corner of our City benefit from this world-class institution," said Public Advocate Letitia James.
Cornell Tech started up in a temporary space generously provided by Google and has already graduated more than 300 masters and doctoral students, with most entering the New York City tech sector after graduation by joining local companies or starting their own. Masters students across all programs — computer science, law, business, electrical engineering, operations research, connective media and health tech — spend time learning and working collaboratively together in a Studio curriculum with extensive engagement with the tech industry. The projects students pursue in the Studio encourage them to practice entrepreneurship, product design, tech and public policy, management and other skills, helping them graduate with tangible, marketable experience and a portfolio of completed work that will help launch their career.
Cornell Tech's 30-member faculty has launched cutting-edge research groups in the areas of Human-Computer Interaction and Social Computing, Security and Privacy, Artificial Intelligence, Data and Modeling, and Business, Law and Policy. All of the faculty have a focus on applied research and having a real world impact.
"We are entering a new era for tech in New York, and the Cornell Tech campus is at the heart of it. Cornell Tech was given the rare opportunity to create a campus and academic program from scratch. The opening of our new campus brings together academic disciplines critical to the digital transformation of society and the economy, together with companies, early stage investors, and government to spark innovation and help improve the lives of people throughout the City, country and world," said Cornell Tech Dean Daniel Huttenlocher.
The Jacobs Technion-Cornell Institute at Cornell Tech is a unique academic partnership of two leading global universities, the Technion Israel Institute of Technology and Cornell. The Institute houses the Health Tech and Connective Media programs, where students receive dual degrees from Cornell and the Technion, and the Jacobs Runway Startup Postdoc program for recent tech PhDs.The Runway program has been responsible for about half of the more than 30 companies that have spun out of the Cornell Tech campus with more than $20 million in funds raised and employing more than 100 people.
"The Jacobs Technion-Cornell Institute is a cornerstone of Cornell Tech, combining Cornell's commitment to discovery with Technion's global leadership in applied research and entrepreneurship. From our dual masters degree programs, to our groundbreaking faculty research, to the innovative companies spinning out of the Jacobs Runway Startup Postdoc program, our partnership and impact will grow on our new campus. Through the Jacobs Institute, Cornell Tech and New York City as a whole will always be on the leading edge, experimenting with novel ways to educate, discover, and innovate," said Ron Brachman, Director of the Jacobs Technion-Cornell Institute.
"By steering students through Cornell Tech, and its soon-to-come Verizon Executive Education Center, we can build students and business people into lifelong learners and inspire them to be more innovative and impactful leaders. Our investment in Cornell Tech, is a testament of our belief that technology can be a transforming force in our society. This unique institution will be a model for the future and a shining example of how to solve big challenges and make people's lives better," said Lowell McAdam, Chairman and CEO of Verizon.
"Even without a permanent campus, Cornell Tech has already established a proven track record of developing innovative companies and top tier talent here in New York City. Now in its beautiful new home on Roosevelt Island, Cornell Tech immediately establishes itself as one of New York's premier tech institutions—helping us attract and retain the technical talent and companies our industry needs to grow and thrive," said Julie Samuels, Executive Director of Tech:NYC.
From left to right: Chairman of the Board of Governors Lawrence (Larry) Jackier, Technion President Prof. Peretz Lavie, and Chairman of the Technion Council Gideon Frank. No image credit.
In recent years, Technion has indeed been working on many fronts towards this purpose, and the two flagships are its extensions in New York and China, which will be inaugurated this year: the permanent campus of the Jacobs Technion-Cornell Institute (JTCI) for applied engineering-scientific research will be inaugurated in the heart of Manhattan in September 2017, and Guangdong Technion Israel Institute of Technology (GTIIT), near the city of Shantou in China, will be inaugurated in December 2017. Technion is also strengthening its international reputation through strategic cooperation with leading universities around the world. The International School at Technion, which welcomes students from a variety of countries, has significantly expanded its activities and grown from 39 students in 2009 to 700 in 2016.
Prof. Lavie said that these international projects place Technion at the forefront of global research and constitute an important milestone in its progress towards achieving the Technion vision: "Becoming one of the world's ten leading scientific-technological research universities in the development of human capital, leadership, and knowledge, which works to advance the State of Israel and humanity." He also noted the success of the MOOC (Massive Open Online Course) masterminded by Prof. Hossam Haick of the Wolfson Faculty of Chemical Engineering at the Technion: an online course in Arabic and English, which has already brought Technion to around 118,000 men and women from 87 countries, 23 of them in the Middle East.


In this morning's Wall Street Journal, Sir Harold Evans has a beautiful, uplifting piece on the editorial page (Subscription Required). He talks about the innovation and hard work of America's business leaders and inventors and how their contributions have as much impact, if not more, than the politicians and presidents.
After months of torturous campaigning, maybe we can all get back to work.


City of Devils. "While Lemmy is Away… RUSTY EYE WILL PLAY!!!
City of Devils talks on Rusty Eye's live at the Rainbow 2-hour set recording.
While Lemmy is Away… RUSTY EYE will play. As we've been carrying on about this week, Lemmy will be at Club Nokia tonight to be deservedly feted for all he has done to make this world a more tolerable place. But while all that fun is happening, back at his second home RUSTY EYE will be putting on a two hour set on the second floor of the Rainbow Room. Yes, two hours – that's no joke. They will be recording the show and playing tracks from Rust n' Roll, Stendhal Syndrome and Possessor. It all starts at nine and will be followed at 11:30 by the Hells Belles Burlesque show. We're guessing Lemmy will return to the ranch in time for that. The cover is just $5.


text:
Q: Laptop Interface for Desktop Computer I usually buy gaming laptops.  The main reasons are as follows:

*

*I like that I can use them in my lap on a couch without any furniture or mounting.

*The monitor is easily adjusted, either with the hinge or my moving my legs

*The keyboard is attached and doesn't move without requiring any furniture

*I am not being intrusive with my gaming while being in the shared living area of my residence.

I don't really care about the portability, though I do use it as my primary portable computer because I think it is silly to have two laptops when you only really need one portable computer.
I have decided that I should buy a desktop computer, as they are cheaper, more durable, upgradable, and more powerful.  And I only really game from one location.  But I can't find a way to use a desktop from a couch without mounting something to a wall or buying new furniture.
Basically, I want something that looks like a laptop, but is simply a monitor and keyboard (and perhaps a mouse) that plug in to a desktop nearby.
I haven't seen this available for purchase, so I would like to know of this is something I could reasonably build, or ask someone to build, out of an old dead laptop.
If I am to build it, I intend to convert the existing components for desktop use.  However, there is one major component I do not know what to do with.
How can I identify a compatible keyboard controller for a laptop keyboard?  Do such controllers exist?  I know there are monitor controllers for laptop monitors that accept HDMI inputs, as well as a fairly reliable method for acquiring them, but I can't find a reliable way to identify a compatible laptop keyboard controller.  If I could convert the laptop keyboard in to a USB keyboard, then I could reasonably build this device myself.
This question has been asked before, but it has been a few years and maybe there are newer solutions.  The device in the second link is about 3 times more expensive than it should be, with a 1366 x 768 screen and costing around $600, plus I am not sure if it operates without significant latency.
Related questions:

*

*How can I use a desktop like a laptop

*External laptop-format device for desktop
EDIT:  Software solutions have been suggested, so I feel I should note that I dual boot my machines with Linux and Windows, so software solutions are not so good because they will not work in GRUB or BIOS.  Plus, I would like to keep the latency as low as possible, so a hardware solution is best.
"On Hold" appeal:  Though I did mention that I could not purchase the interface, that was not the focus of the question.  I asked whether this was a reasonable thing to build myself, not to purchase, as well as advice on how to convert an existing laptop.  As a guide to what I don't know, I also ask for more specific advice for existing components I already own that I do not know how to convert.  Therefore, this is not a question about "where can I purchase" or "what can I buy to do this", but rather "How do I build this" and "Is there a way to determine what I need."  I am NOT asking for purchasing advice as a primary question, as it is my belief that the thing I am looking for does not exist for sale.
If the item in question is the laptop keyboard controller, the paragraph is about determining which one I need, not where I can get one.  Of course, the end goal for me is to acquire one, but I didn't ask where I could get one, I asked how I could determine what kind I need.  To reduce the appearance that I am asking for specific items to purchase, I reworded that section.
It is possible this is in the wrong stack exchange, so if you believe this is off topic, could you direct me to a stack exchange where it is on topic? Because this is where I was directed for hardware questions.


Adjustable Music Black Keyboard Piano "X" Stand Electric Organ Metal Rack Height. Foldable Metal Music Stand Sheet Adjustable Holder Instrument Carrying Bag Black. US Professional Alto Drop E Tenor Saxophone Gold Sax Abalone Key High Saxofon Cases. If you are a music enthusiast , please pay attention to this Alto Drop E Paint Gold Saxophone.
Made of high quality and delicate design, it can be used for a long time. This saxophone is easy to play and has a pleasing vibrant feel with a well-centered sound.
The saxophone is suitable for numerous musical forms, including jazz, rock and various ostensibly classical forms. This best saxophone is music amateur and professional person necessity. It is easy to play and it has a pleasing vibrant feel with a well-centered sound 2. Best saxophone is made of paint gold, it can be used for a long time 3.
The best saxophone is music amateur and professional person necessity 4. With highest quality for long term use 5. Beautiful and durable paint gold body. Weight: 135.1oz / 3830g 3. Box Dimensions: (24.01 x 10.24 x 5.51) / (61 x 26 x 14)cm(L x W x H) 5.
Length: 22.83 / 58cm Package Includes: 1 x Saxophone 1 x Mouthpieces 2 x Gloves 1 x Case 3 x Aglet 1 x Reed. The item "Professional Alto Drop E Tenor Saxophone Gold Sax Abalone Key High Saxofon Cases" is in sale since Monday, December 10, 2018. This item is in the category "Musical Instruments & Gear\Wind & Woodwind\Band & Orchestral\Saxophones".box" and is located in New Jersey.


NO 1: Click the "Online Chat"and sellers direct dialogue ,We will answer all your questions!
NO 2: Click the "Message Seller"contact the seller by mail, We will reply you for any questions asap!
prescription glasses online are necessary for us in sunning days especially hot summer. The reason why round glasses are so popular is that they are not only very useful to protect our eyes, but also very fashionable, thus we look much cooler with designer glasses. High-end sunglasses uk are expensive, here in our shop, you can enjoy the best polarised sunglasses and look like a super star with relatively lower price. Come on and start your new journey with baby sunglasses!