<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Computational Geometry in MATLAB R2009a, Part I</title>
	<atom:link href="http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/</link>
	<description>Loren Shure works on design of the MATLAB language at MathWorks. She writes here about once a week on MATLAB programming and related topics.</description>
	<lastBuildDate>Thu, 09 Feb 2012 04:19:21 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Raghu</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32181</link>
		<dc:creator>Raghu</dc:creator>
		<pubDate>Wed, 06 Apr 2011 09:15:30 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32181</guid>
		<description>Thank you very much for this piece of code. I&#039;ll try to use this to loosen some  of the constraints on the intermediate points.
Thank you,
Raghu</description>
		<content:encoded><![CDATA[<p>Thank you very much for this piece of code. I&#8217;ll try to use this to loosen some  of the constraints on the intermediate points.<br />
Thank you,<br />
Raghu</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damian Sheehy</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32180</link>
		<dc:creator>Damian Sheehy</dc:creator>
		<pubDate>Tue, 05 Apr 2011 20:38:17 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32180</guid>
		<description>Raghu,


Thank you for providing a more detailed example. Capturing intent is always a challenge in an edge-case scenario like the one you provided. It is tempting to suggest a tolerance and while that may work for your case it may have shortcomings in other respects. Users may attempt to use large tolerances and the notion of convexity is no longer valid. The Alpha-shape may be a more appropriate construct for addressing  computations like yours. This is basically a generalization of a convex hull that admits concavities. Imagine the 2D convex hull as the boundary defined by a ruler as it traverses tightly around your point set. In contrast, the 2D Alpha Shape is the boundary defined a disk of radius R rather than a ruler. By varying R you can get a family of different shapes. Conceptually, this would appear to be more appropriate, but I cannot comment on how well it would work with your data set. It is a more worthwhile enhancement to consider as opposed to adding a tolerance to convhull.

You may be able to use other computational geometry tools to solve your problem. Here’s an example I came up with based on a triangulation of the dataset. The function triangulates the data and then “peels away” the sliver triangles that (typically) lie on the boundary, revealing the interior points that lie in close proximity. This function may not work for your particular data set; for example, the distribution of points may give rise to slivers in the interior. It any case, it’s something to consider.


&lt;pre&gt;
function k = myconvhull(x,y,rtol)
s1 = warning(&#039;off&#039;,&#039;MATLAB:delaunay:DupPtsDelaunayWarnId&#039;);
s2 = warning(&#039;off&#039;,&#039;MATLAB:TriRep:PtsNotInTriWarnId&#039;);
tri = delaunay(x(:),y(:));     % Triangulate the points
tr = TriRep(tri,x(:),y(:));   % Use a TriRep to represent the triangulation
[~, ccrad] = tr.circumcenters(); % Compute the radius of circumcenters
idx = find(ccrad &gt; rtol);     % Remove sliver triangles (assumed to be on the boundary) 
tri(idx,:) = [];
tr = TriRep(tri,x(:),y(:));   % Create a new TriRep and use it to compute
fb = tr.freeBoundary();       % the free boundary; this is an approximation 
k = fb(:,1);                  % of the convex hull 
k(end+1) = k(1);
&lt;/pre&gt;


Example usage


&lt;pre&gt;
x = [double(1/3) double(1/2) double(2/3) double(1) double(1/3)]
y = [double(2/3) double(1/2) double(1/3) double(1) double(2/3)]
&gt;&gt; k = myconvhull(x,y,10e10)

k =

     1
     2
     3
     4
     1

&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Raghu,</p>
<p>Thank you for providing a more detailed example. Capturing intent is always a challenge in an edge-case scenario like the one you provided. It is tempting to suggest a tolerance and while that may work for your case it may have shortcomings in other respects. Users may attempt to use large tolerances and the notion of convexity is no longer valid. The Alpha-shape may be a more appropriate construct for addressing  computations like yours. This is basically a generalization of a convex hull that admits concavities. Imagine the 2D convex hull as the boundary defined by a ruler as it traverses tightly around your point set. In contrast, the 2D Alpha Shape is the boundary defined a disk of radius R rather than a ruler. By varying R you can get a family of different shapes. Conceptually, this would appear to be more appropriate, but I cannot comment on how well it would work with your data set. It is a more worthwhile enhancement to consider as opposed to adding a tolerance to convhull.</p>
<p>You may be able to use other computational geometry tools to solve your problem. Here’s an example I came up with based on a triangulation of the dataset. The function triangulates the data and then “peels away” the sliver triangles that (typically) lie on the boundary, revealing the interior points that lie in close proximity. This function may not work for your particular data set; for example, the distribution of points may give rise to slivers in the interior. It any case, it’s something to consider.</p>
<pre>
function k = myconvhull(x,y,rtol)
s1 = warning('off','MATLAB:delaunay:DupPtsDelaunayWarnId');
s2 = warning('off','MATLAB:TriRep:PtsNotInTriWarnId');
tri = delaunay(x(:),y(:));     % Triangulate the points
tr = TriRep(tri,x(:),y(:));   % Use a TriRep to represent the triangulation
[~, ccrad] = tr.circumcenters(); % Compute the radius of circumcenters
idx = find(ccrad &gt; rtol);     % Remove sliver triangles (assumed to be on the boundary)
tri(idx,:) = [];
tr = TriRep(tri,x(:),y(:));   % Create a new TriRep and use it to compute
fb = tr.freeBoundary();       % the free boundary; this is an approximation
k = fb(:,1);                  % of the convex hull
k(end+1) = k(1);
</pre>
<p>Example usage</p>
<pre>
x = [double(1/3) double(1/2) double(2/3) double(1) double(1/3)]
y = [double(2/3) double(1/2) double(1/3) double(1) double(2/3)]
&gt;&gt; k = myconvhull(x,y,10e10)

k =

     1
     2
     3
     4
     1
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Raghu</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32177</link>
		<dc:creator>Raghu</dc:creator>
		<pubDate>Tue, 05 Apr 2011 04:50:09 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32177</guid>
		<description>Hello,

Sorry for the confusion, I was not sure if convhull includes points on the hull that are not extremal, but it seems to do so from the following example:

 x = [double(0) double(1) double(2) double(0) double(0)]

x =

     0     1     2     0     0


&gt;&gt; y = [double(0) double(1) double(2) double(1) double(0)]

y =

     0     1     2     1     0

 k = convhull(x,y)                                       

k =

     1
     2
     3
     4
     1


The point i&#039;m having trouble with is as follows:

x = [double(1/3) double(1/2) double(2/3) double(1) double(1/3)]

x =

    0.3333    0.5000    0.6667    1.0000    0.3333

&gt;&gt; y = [double(2/3) double(1/2) double(1/3) double(1) double(2/3)]

y =

    0.6667    0.5000    0.3333    1.0000    0.6667

k = convhull(x,y)

k =

     1
     3
     4
     1


convhulln([x&#039;,y&#039;])

ans =

     3     4
     4     1
     1     3

I fully expected the point (0.5,0.5) to be on the hull but both convhull and convhulln don&#039;t include it. With inpolygon I get:

[inP onP] = inpolygon(double(1/2),double(1/2), x(k), y(k))

inP =

     1


onP =

     1

Of course, inpolygon and convhull might be completely different algorithms and hence the disparity, which was why I felt that if there were a tolerance parameter included in convhull it could be easier to detect points on the hull boundary that are not extremal. In my particular application, the assumption of general position of points is not valid, which is why the non-extremal points also matter in the computation. 

Once again, thanks for getting back, please do let me know if I can provide more information.

Thank you,

Raghu</description>
		<content:encoded><![CDATA[<p>Hello,</p>
<p>Sorry for the confusion, I was not sure if convhull includes points on the hull that are not extremal, but it seems to do so from the following example:</p>
<p> x = [double(0) double(1) double(2) double(0) double(0)]</p>
<p>x =</p>
<p>     0     1     2     0     0</p>
<p>&gt;&gt; y = [double(0) double(1) double(2) double(1) double(0)]</p>
<p>y =</p>
<p>     0     1     2     1     0</p>
<p> k = convhull(x,y)                                       </p>
<p>k =</p>
<p>     1<br />
     2<br />
     3<br />
     4<br />
     1</p>
<p>The point i&#8217;m having trouble with is as follows:</p>
<p>x = [double(1/3) double(1/2) double(2/3) double(1) double(1/3)]</p>
<p>x =</p>
<p>    0.3333    0.5000    0.6667    1.0000    0.3333</p>
<p>&gt;&gt; y = [double(2/3) double(1/2) double(1/3) double(1) double(2/3)]</p>
<p>y =</p>
<p>    0.6667    0.5000    0.3333    1.0000    0.6667</p>
<p>k = convhull(x,y)</p>
<p>k =</p>
<p>     1<br />
     3<br />
     4<br />
     1</p>
<p>convhulln([x',y'])</p>
<p>ans =</p>
<p>     3     4<br />
     4     1<br />
     1     3</p>
<p>I fully expected the point (0.5,0.5) to be on the hull but both convhull and convhulln don&#8217;t include it. With inpolygon I get:</p>
<p>[inP onP] = inpolygon(double(1/2),double(1/2), x(k), y(k))</p>
<p>inP =</p>
<p>     1</p>
<p>onP =</p>
<p>     1</p>
<p>Of course, inpolygon and convhull might be completely different algorithms and hence the disparity, which was why I felt that if there were a tolerance parameter included in convhull it could be easier to detect points on the hull boundary that are not extremal. In my particular application, the assumption of general position of points is not valid, which is why the non-extremal points also matter in the computation. </p>
<p>Once again, thanks for getting back, please do let me know if I can provide more information.</p>
<p>Thank you,</p>
<p>Raghu</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damian Sheehy</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32169</link>
		<dc:creator>Damian Sheehy</dc:creator>
		<pubDate>Thu, 31 Mar 2011 19:11:43 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32169</guid>
		<description>Hi Raghu,

Did you try convhulln instead on convhull?  It is not clear what you mean by “Is it then not a good idea to expect such points to be included in the Convex Hull”. One can view this as included in the output definition of the convex hull or included in the interior of the convex hull. Either way, why is it not a good idea? If you have compelling reasons why the function should behave in a specific manner then we can consider filing an enhancement, but you have to justify your reasoning.

Thanks,

Damian</description>
		<content:encoded><![CDATA[<p>Hi Raghu,</p>
<p>Did you try convhulln instead on convhull?  It is not clear what you mean by “Is it then not a good idea to expect such points to be included in the Convex Hull”. One can view this as included in the output definition of the convex hull or included in the interior of the convex hull. Either way, why is it not a good idea? If you have compelling reasons why the function should behave in a specific manner then we can consider filing an enhancement, but you have to justify your reasoning.</p>
<p>Thanks,</p>
<p>Damian</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Raghu</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32166</link>
		<dc:creator>Raghu</dc:creator>
		<pubDate>Thu, 31 Mar 2011 07:34:06 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32166</guid>
		<description>Thanks for the clarification. In my particular application, there are a lot of cases where collinearity necessarily occurs. Is it then not a good idea to expect such points to be included in the Convex Hull (e.g., (0.5,0.5) between 
(0.3333, 0.6667) and (0.6667, 0.3333)) All points are generated internally, so they should be double precision, I don&#039;t think much can be done to improve how well they are generated. 

Thank you,

Raghu</description>
		<content:encoded><![CDATA[<p>Thanks for the clarification. In my particular application, there are a lot of cases where collinearity necessarily occurs. Is it then not a good idea to expect such points to be included in the Convex Hull (e.g., (0.5,0.5) between<br />
(0.3333, 0.6667) and (0.6667, 0.3333)) All points are generated internally, so they should be double precision, I don&#8217;t think much can be done to improve how well they are generated. </p>
<p>Thank you,</p>
<p>Raghu</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damian Sheehy</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32104</link>
		<dc:creator>Damian Sheehy</dc:creator>
		<pubDate>Fri, 11 Mar 2011 19:29:21 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32104</guid>
		<description>The convhull function accurately computes the convex hull of the data set you provide. It does not take into account the loss of precision that may have incurred when you derived this data. Likewise, it does not have an internal tolerance that relaxes the condition of convexity. Depending on the relative magnitude of the inaccuracies in your input data, this issue can also arise when computations are performed using standard floating point arithmetic. 

Geometric computations in floating point arithmetic typically use internal tolerances to offset the loss of precision in the computation. This may capture intent more favorably in the presence of inaccurate input, but it’s a double edge sword. This approach is inherently fragile in degenerate and near coincidence scenarios and can lead to failure of the algorithm. If you wish to try the floating point computation you can call convhulln([x’ y’]) instead of convhull.</description>
		<content:encoded><![CDATA[<p>The convhull function accurately computes the convex hull of the data set you provide. It does not take into account the loss of precision that may have incurred when you derived this data. Likewise, it does not have an internal tolerance that relaxes the condition of convexity. Depending on the relative magnitude of the inaccuracies in your input data, this issue can also arise when computations are performed using standard floating point arithmetic. </p>
<p>Geometric computations in floating point arithmetic typically use internal tolerances to offset the loss of precision in the computation. This may capture intent more favorably in the presence of inaccurate input, but it’s a double edge sword. This approach is inherently fragile in degenerate and near coincidence scenarios and can lead to failure of the algorithm. If you wish to try the floating point computation you can call convhulln([x’ y’]) instead of convhull.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Raghu</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32100</link>
		<dc:creator>Raghu</dc:creator>
		<pubDate>Fri, 11 Mar 2011 09:28:01 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-32100</guid>
		<description>Hello,
I had posted this earlier on the support site, I was hoping somebody would offer me a solution on how to make it work:
I have two vecs x, y:
x =

    1.0000    1.0000    0.6667    0.3333    0.5000

y =

         0    1.0000    0.3333    0.6667    0.5000

It seems that with all this literature about EGC it would compute the hull, but the point (0.5,0.5) is always left out. Is there any way to include tolerances in convhull computations? e.g., if a point is 1e-8 or closer to the hull, include it in the hull, maybe...
Thank you,
Raghu</description>
		<content:encoded><![CDATA[<p>Hello,<br />
I had posted this earlier on the support site, I was hoping somebody would offer me a solution on how to make it work:<br />
I have two vecs x, y:<br />
x =</p>
<p>    1.0000    1.0000    0.6667    0.3333    0.5000</p>
<p>y =</p>
<p>         0    1.0000    0.3333    0.6667    0.5000</p>
<p>It seems that with all this literature about EGC it would compute the hull, but the point (0.5,0.5) is always left out. Is there any way to include tolerances in convhull computations? e.g., if a point is 1e-8 or closer to the hull, include it in the hull, maybe&#8230;<br />
Thank you,<br />
Raghu</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damian Sheehy</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-31237</link>
		<dc:creator>Damian Sheehy</dc:creator>
		<pubDate>Fri, 02 Apr 2010 16:01:07 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-31237</guid>
		<description>Hi Alex,

	This is an interesting question and I&#039;m sure it&#039;s one that most scientific-minded people have pondered on. Unfortunately, working for a math software company doesn&#039;t give me any greater insight than anyone else who appreciates the beauty of math and science. To find answers to questions like these I subscribe to New Scientist magazine, but it often leaves me with more questions than answers and it appears in my mailbox faster than I can read it. Here&#039;s an interesting and somewhat related article that appeared in last week&#039;s edition:

http://www.newscientist.com/article/mg20527535.100-mind-over-matter-how-your-body-does-your-thinking.html


Damian</description>
		<content:encoded><![CDATA[<p>Hi Alex,</p>
<p>	This is an interesting question and I&#8217;m sure it&#8217;s one that most scientific-minded people have pondered on. Unfortunately, working for a math software company doesn&#8217;t give me any greater insight than anyone else who appreciates the beauty of math and science. To find answers to questions like these I subscribe to New Scientist magazine, but it often leaves me with more questions than answers and it appears in my mailbox faster than I can read it. Here&#8217;s an interesting and somewhat related article that appeared in last week&#8217;s edition:</p>
<p><a href="http://www.newscientist.com/article/mg20527535.100-mind-over-matter-how-your-body-does-your-thinking.html" rel="nofollow">http://www.newscientist.com/article/mg20527535.100-mind-over-matter-how-your-body-does-your-thinking.html</a></p>
<p>Damian</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-31228</link>
		<dc:creator>Alex</dc:creator>
		<pubDate>Wed, 31 Mar 2010 19:58:17 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-31228</guid>
		<description>Math is something that is created by human as a tool to describe our nature. All theoretical physics and even computational algorithms originate from some form of mathematical formulation. Where does the knowledge of math, number, counting, geometry came from in the first place? Do you think math is an intrinsic property of mother nature and so it is also imprinted in our mind, naturally? Is it possible to describe nature using something other than math (ie. planetary motions, fluid dynamics, mechanics)?</description>
		<content:encoded><![CDATA[<p>Math is something that is created by human as a tool to describe our nature. All theoretical physics and even computational algorithms originate from some form of mathematical formulation. Where does the knowledge of math, number, counting, geometry came from in the first place? Do you think math is an intrinsic property of mother nature and so it is also imprinted in our mind, naturally? Is it possible to describe nature using something other than math (ie. planetary motions, fluid dynamics, mechanics)?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Damian Sheehy</title>
		<link>http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-30827</link>
		<dc:creator>Damian Sheehy</dc:creator>
		<pubDate>Thu, 19 Nov 2009 22:00:13 +0000</pubDate>
		<guid isPermaLink="false">http://blogs.mathworks.com/loren/2009/07/15/computational-geometry-in-matlab-r2009a-part-i/#comment-30827</guid>
		<description>Hi Kyle,

You could potentially use a 3D DelaunayTri to compute the intersection. But the implementation may not be simple. I can&#039;t say how it would perform relative to the functions you are currently using as I have not tried or looked at geom3d. But if you were performing the intersection computation repeatedly on the same pair of polyhedra, you may be able to make some gains.

Here&#039;s the approach... Given two polyheda P and Q construct a DelaunayTri Tp and Tq representing each. Test the boundary edges of Tp against Tq (and vice versa). You have have 3 scenarios;
1) Both edge vertices are contained in Tq. 
2) One vertex contained in Tq the other is not - compute the intersection point. 
3) Both edge vertices are not contained in Tq - the edge could potentially pass through Tq or lie completely outside Tq. More analysis, e.g. ray intersection to qualify. The intersection volume would be given by the convex hull of the interior points and intersection points.

OK, you get the idea. It&#039;s not too difficult to get an approximate implementation up and running, but the real effort involves detecting and handling step 3 efficiently. DelaunayTri has a fast pointLocation test that will handle steps 1 and 2 very efficiently.  But whether you can ignore step 3 depends on your accuracy requirements and the &quot;shape&quot; of your polyhedra.

For more ideas see Christer Ericson&#039;s excellent book &quot;Real-Time Collision Detection&quot;. If you want to have a shot at implementing a Delaunay-based algorithm feel free to contact me off-line with any questions.

Damian</description>
		<content:encoded><![CDATA[<p>Hi Kyle,</p>
<p>You could potentially use a 3D DelaunayTri to compute the intersection. But the implementation may not be simple. I can&#8217;t say how it would perform relative to the functions you are currently using as I have not tried or looked at geom3d. But if you were performing the intersection computation repeatedly on the same pair of polyhedra, you may be able to make some gains.</p>
<p>Here&#8217;s the approach&#8230; Given two polyheda P and Q construct a DelaunayTri Tp and Tq representing each. Test the boundary edges of Tp against Tq (and vice versa). You have have 3 scenarios;<br />
1) Both edge vertices are contained in Tq.<br />
2) One vertex contained in Tq the other is not &#8211; compute the intersection point.<br />
3) Both edge vertices are not contained in Tq &#8211; the edge could potentially pass through Tq or lie completely outside Tq. More analysis, e.g. ray intersection to qualify. The intersection volume would be given by the convex hull of the interior points and intersection points.</p>
<p>OK, you get the idea. It&#8217;s not too difficult to get an approximate implementation up and running, but the real effort involves detecting and handling step 3 efficiently. DelaunayTri has a fast pointLocation test that will handle steps 1 and 2 very efficiently.  But whether you can ignore step 3 depends on your accuracy requirements and the &#8220;shape&#8221; of your polyhedra.</p>
<p>For more ideas see Christer Ericson&#8217;s excellent book &#8220;Real-Time Collision Detection&#8221;. If you want to have a shot at implementing a Delaunay-based algorithm feel free to contact me off-line with any questions.</p>
<p>Damian</p>
]]></content:encoded>
	</item>
</channel>
</rss>

